Jestem nowy python (I pochodzić z PHP), czytałem tutoriale i próbuje rzeczy na kilka dni, ale nie mogę zrozumieć ten przykład kolejki (http://docs.python.org/2/library/queue.html)Python wątków i kolejka przykład
def worker():
while True:
item = q.get()
do_work(item)
q.task_done()
q = Queue()
for i in range(num_worker_threads):
t = Thread(target=worker)
t.daemon = True
t.start()
for item in source():
q.put(item)
q.join() # block until all tasks are done
Rzeczą, której nie rozumiem, jest to, w jaki sposób wątek roboczy się kończy i istnieje. Czytałem bloki q.get(), dopóki element nie jest dostępny, więc jeśli wszystkie elementy są przetwarzane i żadna nie pozostanie w kolejce, dlaczego q.get() nie blokuje na zawsze?
To rozwiązanie jest dość ryzykowne. Jeśli wątki robocze są szybkie, przetestują 'q.empty()' zanim jakiekolwiek elementy zostaną dodane do kolejki, a następnie zakończą zanim coś zrobią. Podobnie, jeśli w kolejce pozostanie pojedyncza pozycja, a dwa wątki testują jednocześnie 'q.empty()', oba będą kontynuowane, ale jeden z nich wyjdzie z kolejki, a drugi zablokuje na 'q.get() '. –