Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:Queue.Empty异常处理_Python_Exception Handling_Queue - Fatal编程技术网

Python:Queue.Empty异常处理

Python:Queue.Empty异常处理,python,exception-handling,queue,Python,Exception Handling,Queue,在与某人就Python中的异常处理(由队列对象的处理引发)进行了一次简短的辩论之后,我想我应该把它扔出去 方法1: 方法2: 一个参数是方法1是错误的,因为队列为空不是错误,因此不应使用queue.empty异常处理。另外,如果您认为任务处理部分可能很大,则可以以这种方式进行调试更困难。 另一个论点是,在Python中,任何一种方法都是可以接受的,如果任务处理量很大,则在try/except之外处理任务可能有助于调试,尽管大家都认为这可能比使用方法2更难看 意见 更新:在回答1之后有更多的信息。

在与某人就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()