多进程通信中能否创建多个Pipe?附代码问题求助
多进程中创建多个Pipe通信管道完全可行
当然可以在多进程场景下创建多个独立的Pipe通信管道,每个管道对应一对进程间的专属通信通道,彼此互不干扰,完全满足你说的car与car2、plane与plane2分别通信的需求。
你的代码出现错误的核心原因有两个:
- 定义
test和main函数时只声明了一个connection参数,但启动进程时传递了两个管道对象,导致参数不匹配 - 管道两端的引用有误(比如代码里写了
plane2,但实际创建的是plane1)
修正后的代码示例
from time import sleep from random import random from multiprocessing import Process from multiprocessing import Pipe # 发送端:同时通过两个管道发送数据 def test(car_conn, plane_conn): print('Sender: Running', flush=True) # 给car管道发送数据 for i in range(5): value = random() sleep(value) car_conn.send(f"car_data_{value:.2f}") car_conn.send(None) # 给plane管道发送数据 for i in range(5): value = random() sleep(value) plane_conn.send(f"plane_data_{value:.2f}") plane_conn.send(None) print('Sender: Done', flush=True) # 接收端:同时监听两个管道的数据 def main(car_conn, plane_conn): print('Receiver: Running', flush=True) # 处理car管道的接收 print("--- 开始接收car管道数据 ---") while True: item = car_conn.recv() print(f'>car receiver got {item}', flush=True) if item is None: break # 处理plane管道的接收 print("--- 开始接收plane管道数据 ---") while True: item = plane_conn.recv() print(f'>plane receiver got {item}', flush=True) if item is None: break print('Receiver: Done', flush=True) if __name__ == '__main__': # 创建两个独立的管道 car_main, car_test = Pipe() plane_main, plane_test = Pipe() # 启动发送进程:传入test端的两个管道连接 sender_process = Process(target=test, args=(car_test, plane_test)) sender_process.start() # 启动接收进程:传入main端的两个管道连接 receiver_process = Process(target=main, args=(car_main, plane_main)) receiver_process.start() # 等待进程结束 sender_process.join() receiver_process.join()
关键说明
- 每个Pipe创建后会返回一对连接对象,一端给发送进程,另一端给接收进程,要确保对应关系正确
- 函数参数要和启动进程时传递的参数数量一致,比如需要处理两个管道就定义两个参数
- 可以分别对每个管道的收发逻辑单独处理,彼此完全独立
内容的提问来源于stack exchange,提问作者Chi
相关产品推荐
相关产品推荐

