После коротких дискуссий с кем-то об обработке исключений в Python, вызванных обработкой объекта очереди, я подумал, что выброшу его там...
МЕТОД 1:
import Queue
q = Queue.Queue()
try:
task=q.get(False)
#Opt 1: Handle task here and call q.task_done()
except Queue.Empty:
#Handle empty queue here
pass
#Opt2: Handle task here and call q.task_done()
МЕТОД 2:
import Queue
q = Queue.Queue()
if q.empty():
#Handle empty queue here
else:
task = q.get()
#Handle task here
q.task_done()
Один аргумент состоит в том, что метод 1 неверен, поскольку пустая очередь не является ошибкой и поэтому не должна обрабатываться с использованием исключения Queue.Empty. Кроме того, это может затруднить отладку при кодировании таким образом, если вы считаете, что часть обработки задачи потенциально может быть большой.
Другой аргумент заключается в том, что любой способ приемлем в Python и что обработка задачи за пределами try/except может помочь отладке, если обработка задачи велика, хотя и согласилась, что это может выглядеть более уродливым, чем использование метода 2.
мнения?
ОБНОВЛЕНИЕ: немного больше информации после ответа 1... Обсуждение началось после того, как метод 1 использовался в некотором многопоточном коде. В этом случае код получит блокировку (из объекта threading.Lock) и отпустит ее либо после возвращения задачи, либо из очереди Queue.Empty.
ОБНОВЛЕНИЕ 2: Нам было неизвестно, что объект очереди был потокобезопасным. Похоже, что try/except - это путь!