如何通过多个队列实现多进程IPC?现有代码仅消费队列首个元素
问题根因
你定义的两个工作进程仅执行了一次队列读取、计算、写入操作就直接退出,没有循环消费队列中剩余的待处理元素,因此最终仅输出了第一个元素的计算结果。
修改后可运行代码
from multiprocessing import Process, Queue import math def calculate_square(sq_q, sqrt_q): while True: itm = sq_q.get() # 遇到哨兵值终止进程 if itm is None: break print(f"Calculating sq of: {itm}") square = itm * itm sqrt_q.put(square) def calculate_sqroot(sqrt_q, result_q): while True: itm = sqrt_q.get() if itm is None: break print(f"Calculating sqrt of: {itm}") sqrt = math.sqrt(itm) result_q.put(sqrt) if __name__ == '__main__': sq_q = Queue() sqrt_q = Queue() result_q = Queue() # 写入所有待处理数据 for i in range(5, 20): sq_q.put(i) # 写入哨兵通知平方计算进程数据已全部写入 sq_q.put(None) p_sq = Process(target=calculate_square, args=(sq_q, sqrt_q)) p_sqrt = Process(target=calculate_sqroot, args=(sqrt_q, result_q)) p_sq.start() p_sqrt.start() p_sq.join() # 平方计算全部完成,写入哨兵通知平方根计算进程终止 sqrt_q.put(None) p_sqrt.join() while not result_q.empty(): print(result_q.get())
改动说明
- 给两个工作函数增加了无限循环消费逻辑,仅当读取到哨兵值
None时才终止进程,确保队列中所有有效数据都会被处理 - 使用
None作为队列的结束哨兵,不需要引入锁、共享内存等其他IPC方案,符合你的学习要求 - 新增了Windows平台必须的
if __name__ == '__main__'入口判断,避免多进程启动异常 - 调整了哨兵写入的顺序,确保前序队列的所有数据处理完成后,再给后序进程发送终止信号,不会出现数据丢失,同时两个进程可并行处理,不需要等待前序全部计算完成再启动后序进程
内容的提问来源于stack exchange,提问作者Surya Bhusal
相关产品推荐
相关产品推荐

