У меня есть программа, использующая многопроцессорную обработку пакетов python и Queue. Одна из моих функций имеет такую структуру:
from multiprocessing import Process, Queue
def foo(queue):
while True:
try:
a = queue.get(block = False)
doAndPrintStuff(a)
except:
print "the end"
break
if __name__ == "__main__"
nthreads = 4
queue = Queue.Queue()
# put stuff in the queue here
for stuff in moreStuff:
queue.put(stuff)
procs = [Process(target = foo, args = (queue,)) for i in xrange(nthreads)]
for p in procs:
p.start()
for p in procs:
p.join()
идея состоит в том, что когда я пытаюсь извлечь из очереди, а она пуста, она вызовет исключение и завершит цикл. Итак, у меня есть два вопроса:
1) это безопасная идиома? Есть ли лучшие способы сделать это?
2) Я попытался найти точное исключение, которое возникает, когда я пытаюсь выполнить .get ()
из пустой очереди. В настоящее время моя программа перехватывает все исключения, что отстойно, когда ошибка находится где-то еще, и я получаю только сообщение "конец".
Я пробовал:
import Queue
queue = Queue.Queue()
[queue.put(x) for x in xrange(10)]
try:
print queue.get(block = False)
except Queue.Empty:
print "end"
break
но я получил ошибку, как если бы я не поймал исключение . Какое исключение нужно перехватывать?