Python: Queue.Empty Exception Handling

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

16
задан user1014903 28 June 2012 в 15:40
поделиться