2011-06-27 24 views
13

由於某種原因,我無法訪問Queue.Empty異常 - 我在這裏做錯了什麼?無法訪問Queue.Empty:「AttributeError:'函數'object has no attribute'Empty'」

from multiprocessing import Process, Queue 

# ... 

try: 
    action = action_queue.get(False) 
    print "Action: " + action 
except Queue.Empty: 
    pass 

堆棧跟蹤:

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' 

回答

25

的Queue.Empty例外是隊列模塊中,而不是在multiprocessing.queues.Queue類。多處理模塊實際使用隊列(模塊)空異常類:

from multiprocessing import Queue 
from Queue import Empty 
q = Queue() 
try: 
    q.get(False) 
except Empty: 
    print "Queue was empty" 

如果你想成爲非常明確和詳細,你可以這樣做:

import multiprocessing 
import Queue 
q = multiprocessing.Queue() 
try: 
    q.get(False) 
execpt Queue.Empty: 
    print "Queue was empty" 

有利於前者的做法可能是一個更好的主意,因爲只有一個Queue對象需要擔心,而且您不必擔心是否正在使用類或模塊,就像我的第二個示例中那樣。

+0

啊我現在看到了,我以爲導入Queue導入了模塊,而不是類。謝謝! – Ross

+1

它更加有趣 - 從多處理導入「導入隊列」在多處理中從'__init __。py'中導入Queue函數,該函數從multiprocessing.queues子模塊返回Queue類。鴨子打字和命名空間使有趣的編程! – underrun

相關問題