30

我正在尝试捕获如果 multiprocessing.Queue 为空时引发的 Queue.Empty 异常。以下不起作用:

import multiprocessing
f = multiprocessing.Queue()
try:
      f.get(True,0.1)
except Queue.Empty:
      print 'foo'

这给了我一个名称错误: NameError: name 'Queue' is not defined

用 multiprocessing.Queue.Empty 替换 Queue.Empty 也无济于事。在这种情况下,它给了我一个“AttributeError:'function'对象没有属性'Empty'”异常。

4

2 回答 2

54

您要查找的Empty异常不能直接在multiprocessing模块中使用,因为multiprocessing它是从模块中借用的(它曾经在 Python 2queue中命名)。Queue要使您的代码正常工作,只需import queue在顶部执行以下操作:

尝试这个:

import multiprocessing
import queue # or Queue in Python 2

f = multiprocessing.Queue()
try:
    f.get(True,0.1)
except queue.Empty: # queue here refers to the module, not a class
    print('foo')
于 2012-12-18T21:34:59.390 回答
21

Blckknght 在 2012 年的回答仍然是正确的,但是使用 Python 3.7.1 我发现你必须使用 queue.Empty 作为要捕获的异常的名称(注意“队列”中的小写“q”。)

所以,回顾一下:

import queue

# Create a queue
queuevarname = queue.Queue(5) # size of queue is unimportant

while some_condition_is_true:
    try:
        # attempt to read queue in a way that the exception could be thrown
        queuedObject = queuevarname.get(False)

        ...
    except queue.Empty:
        # Do whatever you want here, e.g. pass so
        # your loop can continue, or exit the program, or...
于 2019-01-02T04:34:22.623 回答