Проверка на пустую очередь в многопроцессорной обработке python

У меня есть программа, использующая многопроцессорную обработку пакетов 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

но я получил ошибку, как если бы я не поймал исключение . Какое исключение нужно перехватывать?

7
задан Rafael S. Calsaverini 18 August 2011 в 14:30
поделиться