Я новичок в Python (я из PHP), я читал учебники и пытается вещи в течение нескольких дней, но я не могу понять этот пример очереди (http://docs.python.org/2/library/queue.html)Python потоков и очереди Пример
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
Я не понимаю, как рабочий поток завершается и существует. Я читал блоки q.get() до тех пор, пока элемент не будет доступен, поэтому, если все элементы обработаны и в очереди не осталось, почему q.get() не блокируется навсегда?
Это решение довольно рискованное. Если рабочие потоки бывают быстрыми, они будут проверять 'q.empty()' до того, как все элементы будут добавлены в очередь, а затем выйдите, прежде чем они что-нибудь сделают. Точно так же, если в очереди остался один элемент, а два потока проверяют 'q.empty()' одновременно, они оба будут продолжаться, но один получит элемент из очереди, а другой будет блокироваться в 'q.get() '. –