Python:Queue.Empty异常处理
在与某人就Python中的异常处理(由队列对象的处理引发)进行了一次简短的辩论之后,我想我应该把它扔出去 方法1: 方法2: 一个参数是方法1是错误的,因为队列为空不是错误,因此不应使用queue.empty异常处理。另外,如果您认为任务处理部分可能很大,则可以以这种方式进行调试更困难。 另一个论点是,在Python中,任何一种方法都是可以接受的,如果任务处理量很大,则在try/except之外处理任务可能有助于调试,尽管大家都认为这可能比使用方法2更难看 意见 更新:在回答1之后有更多的信息。。。。Python:Queue.Empty异常处理,python,exception-handling,queue,Python,Exception Handling,Queue,在与某人就Python中的异常处理(由队列对象的处理引发)进行了一次简短的辩论之后,我想我应该把它扔出去 方法1: 方法2: 一个参数是方法1是错误的,因为队列为空不是错误,因此不应使用queue.empty异常处理。另外,如果您认为任务处理部分可能很大,则可以以这种方式进行调试更困难。 另一个论点是,在Python中,任何一种方法都是可以接受的,如果任务处理量很大,则在try/except之外处理任务可能有助于调试,尽管大家都认为这可能比使用方法2更难看 意见 更新:在回答1之后有更多的信息。
争论是在方法1用于某些多线程代码之后开始的。在这种情况下,代码将获取锁(从threading.lock对象),并在返回任务或抛出Queue.Empty后释放它
更新2:我们都不知道队列对象是线程安全的。看来尝试/例外是最好的选择 如果这是多线程/多处理代码(这也是使用队列的一个很好的理由),那么方法1肯定是正确的。在
q.empty()
调用和q.get()
调用之间,红心杰克可能偷了你的馅饼
一个参数是方法1是错误的,因为队列为空不是错误,因此不应使用queue.empty异常处理
异常不一定是“错误”,它是一种通用的流控制机制,在少数情况下(SysExit、StopIteration等)确实是这样使用的
这里的好问题是:最常见的情况是什么-空队列还是非空队列。除非你确实知道,否则你想在跳跃前询问,因为它很可能便宜得多。方法2是错误的,因为你在两个步骤中完成一个操作,而它可以在一个步骤中完成。在方法2中,检查队列是否为空,然后稍后(很快,但仍然很晚)尝试获取项目。如果有两个线程从队列中提取项目,会怎么样?get()仍可能因队列为空而失败。如果在检查某个项目是否为空后将其添加到队列中,该怎么办?这是一个很小的机会之窗,在这里,bug潜入并发代码 一步到位,这是最好的选择
import Queue
q = Queue.Queue()
try:
task = q.get(False)
except Queue.Empty:
# Handle empty queue here
pass
else:
# Handle task here and call q.task_done()
不要因为“例外应该是错误”而挂断电话。例外只是另一种沟通渠道,请使用它们。在这里使用“else”子句来缩小exception子句的范围。在一些多线程代码中使用方法1之后,开始了争论。在这种情况下,代码将获取锁(从threading.lock对象)并在返回任务或抛出Queue.Empty后释放它……相同的意见?尽可能保持错误处理代码的严密性-调用
get
,然后立即检查错误。不需要在try中嵌入其余的代码…我看不出锁是如何改变答案的,我也不明白为什么它需要锁,队列已经是线程安全的。导入队列不工作。在Python 3中。这个可以更新吗?
import Queue
q = Queue.Queue()
if q.empty():
#Handle empty queue here
else:
task = q.get()
#Handle task here
q.task_done()
import Queue
q = Queue.Queue()
try:
task = q.get(False)
except Queue.Empty:
# Handle empty queue here
pass
else:
# Handle task here and call q.task_done()