Python吊管

2024-09-28 01:23:12 发布

您现在位置:Python中文网/ 问答频道 /正文

main0不挂起,但main1挂起。为什么?我认为把它打包到类中应该是无害的。。。在

子进程只需将接收到的消息发送回主进程。在

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.

输出:

^{pr2}$

Tags: selfsendchilddefmsgconnprocessstart

热门问题