在与某人就 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:我们俩都不知道队列对象是线程安全的。看起来尝试/除了是要走的路!