📅  最后修改于: 2023-12-03 15:23:26.469000             🧑  作者: Mango
管道是一种进程间通信的方式,它可以在父进程和子进程之间传递数据。在Python中,可以使用os.pipe()
或multiprocessing.Pipe()
创建管道。
os.pipe()
import os
r, w = os.pipe() # 创建管道,返回读、写两个端点的文件描述符
pid = os.fork() # 创建子进程
if pid == 0: # 子进程
os.close(w) # 关闭写端
r = os.fdopen(r) # 将文件描述符转换为文件对象
data = r.read() # 从管道中读取数据
print(f"子进程读取到数据:{data}")
r.close() # 关闭读端
else:
os.close(r) # 关闭读端
w = os.fdopen(w, mode="w") # 将文件描述符转换为文件对象
w.write("Hello, world!") # 向管道中写入数据
w.close() # 关闭写端
运行结果:
子进程读取到数据:Hello, world!
multiprocessing.Pipe()
import multiprocessing
r, w = multiprocessing.Pipe() # 创建管道对象,返回一个元组,包含两个端点
def child(conn):
data = conn.recv() # 从管道中读取数据
print(f"子进程读取到数据:{data}")
conn.close() # 关闭连接
p = multiprocessing.Process(target=child, args=(r,))
p.start() # 启动子进程
w.send("Hello, world!") # 向管道中写入数据
w.close() # 关闭连接
p.join() # 等待子进程结束
运行结果:
子进程读取到数据:Hello, world!
管道可以用于进程之间的通信,但也有一些限制。首先,管道只能用于具有亲缘关系的进程,即父进程和子进程之间的通信。其次,管道是有缓冲区的,如果写入的数据超过了缓冲区的大小,程序会阻塞,直到缓冲区中的数据被读取。因此,如果需要异步通信,可以考虑使用multiprocessing.Queue()
。