Python: Queue.Empty Exception Handling
После короткой дискуссии с кем-то об обработке исключений в Python, вызванной обработкой объекта очереди, я подумал, что я его выброшу ...
METHOD 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()
METHOD 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 / кроме может помочь в отладке, если обработка задачи велика, хотя было решено, что это может выглядеть уродливее, чем при использовании метода 2.
Мнения?
ОБНОВЛЕНИЕ: немного больше информации после того, как ответ 1 прошел .... Дискуссия началась после того, как метод 1 использовался в многопоточном коде. В этом случае код получит блокировку (из объекта threading.Lock) и освободит ее либо после того, как будет возвращено задание, либо будет выдан Queue.Empty.
ОБНОВЛЕНИЕ 2: нам обоим было неизвестно, что объект очереди был потокобезопасным. Похоже, попробуйте / кроме это путь!