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()*
'parent_conn, child_conn = Pipe()'둘 다에 파이프를 할당하겠습니까? 그렇다면',' – synchronizer
@synchronizer 대신'='을 사용해야합니다. https://docs.python.org/3/library/multiprocessing.html의 Pipe 섹션에서 python 3 문서의 예제를 수정했습니다. –