2009-09-18 3 views
11
다음과 같은 오류를 야기 제공

을 감안할 때 this bug (Python Issue 4892) :파이썬 2.6 전송 연결 개체 이상의 대기열/파이프/등

사람이 해결 방법을 알고 있나요

>>> import multiprocessing 
>>> multiprocessing.allow_connection_pickling() 
>>> q = multiprocessing.Queue() 
>>> p = multiprocessing.Pipe() 
>>> q.put(p) 
>>> q.get() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File  "/.../python2.6/multiprocessing/queues.py", line 91, in get 
    res = self._recv() 
TypeError: Required argument 'handle' (pos 1) not found 
이 대기열에 연결 개체를 전달할 수 있습니까?

감사합니다.

답변

8

(내가 믿는 무엇을) 더 나은 방법, 어떤이 게시물을 발견하기 전에 (내가 같은 문제가 된 파이프를 통해 파이프를 통과하고 싶었다..) 주위 재생 후 : 나는 '

>>> from multiprocessing import Pipe, reduction 
>>> i, o = Pipe() 
>>> reduced = reduction.reduce_connection(i) 
>>> newi = reduced[0](*reduced[1]) 
>>> newi.send("hi") 
>>> o.recv() 
'hi' 

을 이것이 왜 이렇게 만들어 졌는지 완전히 모르겠다. (누군가 멀티 프로세싱의 축소 부분이 무엇인지에 대한 통찰력이 필요하다.)하지만 확실히 작동하고 피클 가져 오기가 필요 없다. 그것 이외에, 그것은 그것이하는 일에서 위와 거의 비슷하지만, 더 간단합니다. 나는 파이썬 버그 보고서에 이것을 던져서 다른 사람들이 해결 방법을 알고 있도록했다.

+0

좋은 답변입니다. 확실히 더 나은 옵션이 될 것 같습니다. –

+3

이것은 좋은 대답이며 나를 위해 2.6에서 일하고 있습니다. 그러나, 2.7에서,'reduce.rebuild_connection' AKA'reduced [0]'함수가 호출 될 때, 쓰레드는 무한정 차단됩니다. –

+0

@SamMagura와 같은 문제가 있습니다. 누구든지 Python 2.7에 대한 해결책을 알고 있습니까? – redrah

7

는 여기에 내가 무슨 짓을했는지 대략입니다 :

# Producer 
from multiprocessing.reduction import reduce_connection 
from multiprocessing import Pipe 

    # Producer and Consumer share the Queue we call queue 
def handle(queue): 
    reader, writer = Pipe() 
    pickled_writer = pickle.dumps(reduce_connection(writer)) 
    queue.put(pickled_writer) 

# Consumer 
from multiprocessing.reduction import rebuild_connection 

def wait_for_request(): 
    pickled_write = queue.get(block=True) # block=True isn't necessary, of course 
    upw = pickle.loads(pickled_writer) # unpickled writer 
    writer = upw[0](upw[1][0],upw[1][1],upw[1][2]) 

마지막 줄은 다음에서 오는 비밀이다 : 다른 사람을 도움이

>>> upw 
(<function rebuild_connection at 0x1005df140>, 
(('/var/folders/.../pymp-VhT3wX/listener-FKMB0W', 
17, False), True, True)) 

희망. 그것은 나를 위해 잘 작동합니다.

+0

감사합니다. 매우 유용한 답변입니다. – EdwardAndo

관련 문제