2017-04-24 5 views
0

main0은 응답하지 않지만 main1은 중단됩니다. 왜??? 클래스에 랩핑하는 것은 무해해야한다고 생각했습니다 ...파이썬 파이프 응답

자식 프로세스는 수신 한 msg를 단순히 주 프로세스로 보내야합니다.

Python3 코드 :

from multiprocessing import Process, Pipe 
def child(conn): 
    print("child started") 
    while True: 
     msg = conn.recv() 
     if msg == "quit": 
      break 
     print("child recv:"+msg) 
     print("child sending:" + msg) 
     conn.send(msg) 
    conn.close() 
    print("child ended") 


def main0(): 
    parent_conn, child_conn = Pipe() 
    p = Process(target=child, args=(child_conn,)) 
    p.start() 
    parent_conn.send("ping") 
    print(parent_conn.recv()) 
    parent_conn.send("quit") 
    print("#parent ended#") 
    p.join() 


class Parent(object): 
    def __init__(self): 
     self.parent_conn = None 
     self.child_conn = None 
     self.p = None 

    def start(self): 
     self.parent_conn, self.child_conn = Pipe() 
     self.p = Process(target=child, args=(self.child_conn,)) 
     self.p.start() # <--- i initially missed this line 
     print("started") 

    def send(self, msg): 
     print("try to send: " + msg) 
     self.parent_conn.send(msg) 
     return self.parent_conn.recv() 

    def close(self): 
     self.parent_conn.send("quit") 
     self.p.join() 


def main1(): 
    a = Parent() 
    a.start() 
    print(a.send("ping")) 
    print(a.send("quit")) 
    a.close() 


if __name__ == '__main__': 
    main0() # doesn't hang 
    main1() # hangs. 

출력 :

내가 시작 방법에 self.p.start() 라인을 놓친
~~~ main 0 ~~~ 
child started 
child recv:ping 
child sending:ping 
ping 
#parent ended# 
child ended 

~~~ main 1 ~~~ 
started <Process(Process-1, started)> 
try to send: ping 
waiting to recv 
child started 
child recv:ping 
child sending:ping 
ping 
try to send: quit 
waiting to recv 
child ended 
*still hangs ... after adding self.p.start()* 
+0

'parent_conn, child_conn = Pipe()'둘 다에 파이프를 할당하겠습니까? 그렇다면',' – synchronizer

+0

@synchronizer 대신'='을 사용해야합니다. https://docs.python.org/3/library/multiprocessing.html의 Pipe 섹션에서 python 3 문서의 예제를 수정했습니다. –

답변

0

.

어린이에게 quit 메시지를 보내면 메시지가 반환되지 않습니다. 올바른 main1()는 같아야

def main1(): 
    a = Parent() 
    a.start() 
    print(a.send("ping")) 
    a.close() 

다음이 고정된다.