2017-04-24 3 views
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()* 
+0

'parent_conn, child_conn = Pipe()' Wollen Sie beiden eine Pipe zuweisen? Wenn ja, sollten Sie ein anderes '=' anstelle eines ',' – synchronizer

+0

@synchronizer verwenden, ich änderte das Beispiel des Python 3 Docs am Rohrabschnitt von https://docs.python.org/3/library/multiprocessing.html –

Antwort

0

I self.p.start() Linie am Anfang Methode verpasst.

Auch Senden quit Nachricht an Kind würde keine Nachricht zurückgeben. Die richtige main1() sollte sein:

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

Dann ist dieser befestigt ist.

Verwandte Themen