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

多进程Queue处理完毕后程序阻塞,求添加消费者退出条件

问题解决思路
  1. 修正信号量初始值:empty信号量代表队列的空闲位置数,初始值应设为队列最大容量MAX_SIZE而非1,这样才能让队列最多存放5个元素,符合设定要求。
  2. 添加结束标记机制:生产者完成所有元素生产后,向队列中放入与消费者数量一致的结束标记(比如None),每个消费者收到标记后退出循环,避免无限等待导致阻塞。
修改后的完整代码
from multiprocessing import Process, Queue, Semaphore, Lock

MAX_SIZE = 5

full = Semaphore(0)
empty = Semaphore(MAX_SIZE)  # 修正:初始值设为队列最大容量

testQueue = Queue()

processList = []


def prodt():
    for i in range(101):
        empty.acquire()
        testQueue.put(i)
        full.release()
    # 生产者完成后,放入对应数量的结束标记(匹配消费者数量)
    for _ in range(len(processList)):
        empty.acquire()
        testQueue.put(None)
        full.release()


def cons():
    while True:
        full.acquire()
        idx = testQueue.get()
        empty.release()
        # 判断是否为结束标记,是则退出循环
        if idx is None:
            break
        print(idx)


for i in range(2):
    processList.append(Process(target=cons))

for i in processList:
    i.start()

prodt()

for i in processList:
    i.join()
关键修改点说明
  • 信号量修正:把empty的初始值改为MAX_SIZE,保证队列能填满到设定的最大容量,充分利用缓冲区空间。
  • 结束标记添加:生产者循环结束后,根据消费者数量放入对应数量的None,确保每个消费者都能收到退出信号,不会一直阻塞在full.acquire()操作上。
  • 消费者退出逻辑:消费者取出元素后判断是否为None,如果是则立即退出循环,进程自然结束,避免无限等待。

内容的提问来源于stack exchange,提问作者Duarte GV

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 15:56:02