2017-10-25 10 views
1

コーディングが初めてです。プロセス間通信にPipe()を複数回使用できるかどうかを知りたい。はいの場合、次のコードには何がありますか?いいえの場合、1本のパイプを複数回使用できない理由は何ですか?あなたは今ではそれを考え出したていない場合はPythonのIPCでmultiprocessing.Pipe()を複数回使用できますか?

import multiprocessing 

def f1(pipe): 
    r, w = pipe 
    r.close() 
    for n in range(10): 
     w.send(n) 

def f2(pipe): 
    r, w = pipe 
    w.close() 
    while True: 
     try: 
      item = r.recv() 
     except EOFError: 
      break 
     print("Item received by f2:", item) 

def f3(pipe): 
    r, w = pipe 
    r.close() 
    for n in range(10, 21): 
     w.send(n) 

def f4(pipe): 
    r, w = pipe 
    w.close() 
    while True: 
     try: 
      item = r.recv() 
     except EOFError: 
      break 
     print("Item received by f2:", item) 


if __name__ == '__main__': 
    (r, w) = multiprocessing.Pipe() 
    p1 = multiprocessing.Process(target=f1, args=((r, w),)) 
    p2 = multiprocessing.Process(target=f2, args=((r, w),)) 
    p1.start() 
    p2.start() 
    w.close() 
    p1.join() 
    p2.join() 
    #(r, w) = multiprocessing.Pipe() 
    p3 = multiprocessing.Process(target=f3, args=((r, w),)) 
    p4 = multiprocessing.Process(target=f4, args=((r, w),)) 
    p3.start() 
    p4.start() 
    w.close() 
    p3.join() 
    p4.join() 

答えて

2

、問題はあなたが(あなたが「R」と「W」と呼んだもの)の両方の接続オブジェクトをクローズしているです。あなたがそれらを閉じるともう使用することはできません。ちょうどの文を閉じるとの文がコメントになります。手動で閉じる場合は、がすべてステートメントに参加した後に閉じてください。私もF2で変化するであろう

while r.poll(1): 
    try: 
    ... 

それは秒以上のデータを受信しない場合、ループを終了しますこの方法。

関連する問題