2017-10-25 1 views
1

코딩에 익숙하지 않습니다. Interprocess Communication을 위해 Pipe()를 여러 번 사용할 수 있는지 알고 싶습니다. 그렇다면 다음 코드에서 무엇을 놓치고 있습니까? 그렇지 않다면 한 파이프를 두 번 이상 사용할 수없는 이유는 무엇입니까? 당신은 지금 그것을 파악하지 않은 경우파이썬에서 IPC를 위해 다중 처리. 파이프()를 여러 번 사용할 수 있습니까

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: 
    ... 

는 초 이상 데이터를 수신하지 않는 경우는 루프를 종료합니다 그런 식으로.

관련 문제