2011-06-27 33 views
13

何らかの理由でQueue.Empty例外にアクセスできない - ここで何が間違っていますか?Queue.Emptyにアクセスできない:「AttributeError: 'function'オブジェクトに「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" 

前者のアプローチを好むことは、おそらくです気にするキューオブジェクトが1つだけで、2番目の例のようにクラスやモジュールで作業しているのかどうか疑問に思う必要はありません。

+0

私は今、クラスをインポートするのではなく、モジュールをインポートしてインポートすると考えました。ありがとう! – Ross

+1

それはさらに面白いです。 ''マルチプロセッシングimport Queue'からインポートすると、multiprocessing.queuesサブモジュールからQueueクラスを返すマルチプロセッシングの '__init __。py'からQueue関数がインポートされます。ダックタイピングと名前空間は面白いプログラミングのためのものです! – underrun

関連する問題