После коротких дебатов с кем-то об обработке исключений в Python, вызванных обработкой объекта очереди, я решил выбросить это туда...
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()
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. Нам обоим было неизвестно, что очередь объект был потокобезопасным.Похоже, попробуйте/кроме - это путь!