我正在尝试了解使用multiprocessing.Pipe
来传达两个流程的正确方法。我想出了下面的代码,它似乎可以工作:
import multiprocessing
def f(parent_conn, child_conn):
parent_conn.close()
while True:
cmd, data = child_conn.recv()
if cmd == "f1":
child_conn.send("f1!")
elif cmd == "f2":
child_conn.send("f2!")
else:
raise NotImplementedError
if __name__ == "__main__":
parent_conn, child_conn = multiprocessing.Pipe()
p = multiprocessing.Process(target=f, args=(parent_conn, child_conn))
p.start()
child_conn.close()
parent_conn.send(("f1", None))
parent_conn.send(("f2", None))
print(parent_conn.recv())
print(parent_conn.recv())
但是我不清楚parent_conn
和child_conn
的真正含义,以及为什么我必须致电child_conn.close()
和parent_conn.close()
(假设在服务器中关闭这些连接是正确的)第一名)。 parent_conn
和child_conn
到底是什么?我的代码是否包含任何错误或不良做法?
答案 0 :(得分:0)
什么是parent_conn和child_conn
它们是connection objects,它们连接到管道的不同末端。
管道是一个通信通道。
如果一个进程持有这些对象之一,而另一个进程持有另一个,则它们可以使用这些连接对象的send
和recv
方法彼此通信。
如果某个进程有两个可用的管道末端,则它可能要关闭将不使用的那一端。这样做可能是一个好主意,因为那样就不会发生两个不同的进程尝试写入或读取同一管道端的情况(这可能会产生一些here
不太令人满意的结果)