Python - tworzenie wątków zadanie

0

Dobry wieczór, pracuje nad zadaniem domowym, którego treść prezentuje się następująco:

Napisz program w języku python, który stworzy 50 wątków. Każdy wątek posiada numer, który jest argumentem funkcji. Zadaniem każdego z wątków jest obliczenie potęgi liczby 2. Wykładnikiem potęgi jest numer wątku. Po wykonaniu obliczeń należy wypisać zawartość na ekran. Wątki muszą korzystać z blokady lock przy dostępie do terminala. Czas pracy wątku ustawić na 2 sekundy. Wątki mają dokonać obliczeń przed końcem wątku głównego.>

Moje rozwiązanie:

import _thread
import time

liczbawatkow = 50

def potega(nrWatku):
	time.sleep(2)
	mutex.acquire()
	print('Watek nr:', nrWatku, 'potega 2: ',2**nrWatku)
	mutex.release()
	
mutex = _thread.allocate_lock()

for i in range(liczbawatkow):
	_thread.start_new_thread(potega, (i, ))

time.sleep(6)
print('Koniec.')

Czy moje rozwiązanie jest poprawne? W jaki sposób mogę wypisać wynik po kolei tj.: od wątku nr 0 do 49?

1
  1. Skąd funkcja ma wiedzieć co to mutex? Dopiero po funkcji go inicjujesz.
  2. Wyników działania wątków nie wypiszesz po kolei, chyba że te wyniki pozbierasz i posortujesz albo zastosujesz jakąś synchronizację wątków.
    Właśnie na tym polega wiele ćwiczeń z wątkami. Żeby pokazać, że wątek da odpowiedź, kiedy skończy działanie, a kiedy skończy nie możemy przewidzieć.
2
Spine napisał(a):
  1. Skąd funkcja ma wiedzieć co to mutex? Dopiero po funkcji go inicjujesz.

Technicznie to taki kod jest w 100% poprawny:

def foo():
    print(x)

x = 2 

if __name__ == "__main__":
    foo()

foo kompiluje się do takiego bytecodu

4 0 LOAD_GLOBAL 0 (x)
3 PRINT_ITEM
4 PRINT_NEWLINE
5 LOAD_CONST 0 (None)
8 RETURN_VALUE

więc zmienna globalna może być stworzona równie dobrze po funkcji. Ważne żeby w globals była ta zmienna podczas wywoływania funkcji.

2

Musi byc to koniecznie zrobione w _thread ? Biblioteka threading + Queue daje wieksze mozliwosci. Kiedys robilem cos podobnego (laczenie danych z wielu watkow) i nawet mam chyba kod

1 użytkowników online, w tym zalogowanych: 0, gości: 1