0
main0
hängt nicht, aber main1
hängt. Warum??? Ich dachte, das Ding in eine Klasse zu wickeln sollte harmlos sein ...Python Pipe Hang
Der Kindprozess sollte einfach die msg senden, die es zurück zum Hauptprozess erhält.
Python3 Code:
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.
Ausgang:
~~~ 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()' Wollen Sie beiden eine Pipe zuweisen? Wenn ja, sollten Sie ein anderes '=' anstelle eines ',' – synchronizer
@synchronizer verwenden, ich änderte das Beispiel des Python 3 Docs am Rohrabschnitt von https://docs.python.org/3/library/multiprocessing.html –