2012-05-04 9 views
2

これはPython 3.2.2用です。Pythonマルチプロセッシングパイプは正しくrecv()しません

from multiprocessing import Pipe, Process 

def f(r): 
    print(r.recv()) 

if __name__ == '__main__': 
    q, r = Pipe() 
    p = Process(target=f, args=(r,)) 
    p.start() 
    q.send([42, None, 'hello']) 
    p.join() 

は、メインスレッドが新しいProcesspを作成し、機能f()に、双方向の接続オブジェクト、rを送信:私はちょうどPythonとマルチプロセッシングの仕事とこの単純な例では、私をトリップされたかを学んでいます。プロセスpが起動すると、メインプロセスがいくつかのオブジェクトをq.sendまで送信するまで、r.recv()がブロックすることを期待しています(これは、わかっている限り、このプロセスが何かがパイプを通過するまで無期限に待機することを意味します)。

次にp.join()は、pが実行されるまでメインプロセスを待機させる必要があります。

何も起こりません。 f()print文を追加すると、f()が実行されないようになり、p.start()が機能しないように、何も起こりません。

なぜこれが機能しないのか、何が修正されるのか説明できますか?

答えて

0

経験から、私が始めたプロセスからは印刷できないことがわかりました。あなたは、あなたのプログラムを逆に試みることができる:

from multiprocessing import Pipe, Process 

def f(r): 
    r.send([42, None, 'hello']) 

if __name__ == '__main__': 
    q, r = Pipe() 
    p = Process(target=f, args=(r,)) 
    p.start() 
    print(q.recv()) 
    p.join() 
1

私はそれはしばらくしている知っているが、この問題と他の人のために、あなたは逆に、あなたのパイプの両端を持っています。送信側で受信側を使用し、送信側で受信しようとしています。私はデュプレックス= Trueをパイプコンストラクタに追加すると、さまざまな端を扱うのがはるかに簡単になります。

出典:https://docs.python.org/2/library/multiprocessing.html#pipes-and-queues

関連する問題