Python - tworzenie wątków zadanie

Python - tworzenie wątków zadanie
N1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1
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:

Kopiuj
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?

Spine
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6965
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ć.
PA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 426
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:

Kopiuj
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.

ledi12
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.