2017-05-07 5 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)에 파이썬 3.6에서 우리가 얻을 :

: self._poll은()에 의해 초기화에 설정되어

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

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

좋아 ... :

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의 자기를 할당해야합니다 - 질문 그래서 몇

 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에 투표 하시겠습니까? 아니면 상속 계층 구조에서 뭔가를 놓치고 있습니까? 내가 부족 PipeConnection의 _poll의 결합은 다른 있습니까 - # 1이 작동해서는 안

2) PipeConnection의 _poll 루틴은

는 *)

..., 시간 초과 매개 변수를?

내가 누락 된 항목이 있습니까? Python3.6, Windows, PyCharm에서 디버깅을 사용하고 있으며 모든 경로를 따르며 표준 다중 처리 경로에 있습니다. 나는 어떤 도움이나 조언을 주셔서 감사합니다. 감사!

편집 : 추가 검토 후 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