2017-05-07 25 views
2

標準キューを使用してサンプルをプロセスに送信すると、すべて正常に動作します。しかし、私のニーズは単純なので、SimpleQueueを使用しようとしましたが、何らかの理由で「空の」メソッドが機能しません。ここでは詳細です:Python 3.6: "AttributeError: 'SimpleQueue'オブジェクトに '_poll'属性がありません。

エラー(sample_queueのがキューであるときsample_queueのがSimpleQueueあるとき、すべてが物事が壊れ、動作します)消費者のプロセスから来ている:

 def frame_update(i): 
     while not self.sample_queue.empty(): 
      sample = self.sample_queue.get() 
      for line in lines: 

sample_queue.emptyを実行中() - SimpleQueue。 、)(空窓(queues.py)上のPython 3.6から我々が得る:

:self._pollは、()で のinitに設定されている

def empty(self): 
     return not self._poll() 

c1 = PipeConnection(h1, writable=duplex) 
c2 = PipeConnection(h2, readable=duplex) 

素晴らしい、[OK]を... :

def __init__(self, *, ctx): 
    self._reader, self._writer = connection.Pipe(duplex=False) 
    self._rlock = ctx.Lock() 
    self._poll = self._reader.poll 
    if sys.platform == 'win32': 
     self._wlock = None 
    else: 
     self._wlock = ctx.Lock() 

だから私はconnection.Pipe(connection.py)から設定されているself._readerに従ってください。

1)SimpleQueueののinitが自己を割り当てるべきではありません: - 質問のだから、カップル

 def _poll(self, timeout): 
     if (self._got_empty_message or 
        _winapi.PeekNamedPipe(self._handle)[0] != 0): 
      return True 
     return bool(wait([self], timeout)) 

よしは:_readerはPipeConnectionとパイプの接続は、このメソッドを持っていることになるだろう。 self._reader.pollの代わりにself._reader._pollにポーリングしますか?あるいは、私は継承階層で何かを逃していますか?

2#1が動作してはならないので)PipeConnection _pollルーチン)* ...、

をタイムアウトパラメータを取ります - PipeConnectionのいくつかの他の結合は、私が欠けていることを_pollありますか?

何か不足していますか?私はPython3.6、Windows、PyCharmでデバッグを使用しています。私はすべてのパスを辿り、標準のマルチプロセッシングパスに入っています。私は助けやアドバイスを感謝します。ありがとう!

EDIT:PipeConnectionは、実際に 'poll'メソッドを持つ_ConnectionBaseのサブクラスで、デフォルトのタイムアウトパラメータでバインドされていることがわかります。

そこで質問です:SimpleQueueの初期化と

self._poll = self._reader.poll 

なぜそれが_ConnectionBaseからそれをつかむためにクラス階層を上がるしないを設定している場合は?

答えて

0

キュータイプが機能している理由と、なぜSimpleQueueがそうでないのかを見てみると、キューは_pollメソッド 'after_fork'を前と同じように設定しています。 SimpleQueueはありません。私は本当に誤解していない限り、self._poll = self._reader.pollを追加するSETSTATE方法を変更することにより(queues.py、行338)を以下のように、SimpleQueueが

def __setstate__(self, state): 
    (self._reader, self._writer, self._rlock, self._wlock) = state 
    self._poll = self._reader.poll 

を働く私にはバグのように思えます何か。私はバグレポートを提出し、この投稿を参照します。これが誰かを助けることを願って!

http://bugs.python.org/issue30301

関連する問題