📜  在Python中使用管道在父子进程之间进行通信(1)

📅  最后修改于: 2023-12-03 15:23:26.469000             🧑  作者: Mango

在Python中使用管道在父子进程之间进行通信

管道是一种进程间通信的方式,它可以在父进程和子进程之间传递数据。在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()