无法访问Queue.Empty:"AttributeError:'function'对象没有属性'Empty'"

Ros*_*oss 18 python multiprocessing

出于某种原因,我无法访问Queue.Empty异常 - 我在这里做错了什么?

from multiprocessing import Process, Queue

# ...

try:
    action = action_queue.get(False)
    print "Action: " + action
except Queue.Empty:
    pass
Run Code Online (Sandbox Code Playgroud)

堆栈跟踪:

Traceback (most recent call last):  
File "C:\Program Files\Python27\lib\multiprocessing\process.py", line 258,
  in _bootstrap
  self.run()
File "C:\Program Files\Python27\lib\multiprocessing\process.py", line 114,
  in run
  self._target(*self._args, **self._kwargs)
File "D:\Development\populate.py", line 39, in permutate
  except Queue.Empty: AttributeError: 'function' object has no attribute 'Empty'
Run Code Online (Sandbox Code Playgroud)

und*_*run 27

Queue.Empty异常位于Queue模块中,而不是multiprocessing.queues.Queue类中.多处理模块实际使用Queue(模块)Empty异常类:

from multiprocessing import Queue
from Queue import Empty
q = Queue()
try:
    q.get( False )
except Empty:
    print "Queue was empty"
Run Code Online (Sandbox Code Playgroud)

如果你想要非常明确和冗长,你可以这样做:

import multiprocessing
import Queue
q = multiprocessing.Queue()
try:
    q.get( False )
execpt Queue.Empty:
    print "Queue was empty"
Run Code Online (Sandbox Code Playgroud)

偏爱前一种方法可能是一个更好的主意,因为只有一个Queue对象需要担心,你不必怀疑你是否正在使用类或模块,如我的第二个例子.

  • `from multiprocessing import Queue \ from Queue import Empty` 给了我 `ModuleNotFoundError: No module named 'Queue'` :( (3认同)
  • 它更有趣 - 从多处理导入队列导入`从多处理中的`__init __.py`导入Queue函数,该处理从multiprocessing.queues子模块返回Queue类.鸭子打字和命名空间有趣的编程! (2认同)