You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过多个队列实现多进程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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 16:15:04