多进程Queue处理完毕后程序阻塞,求添加消费者退出条件
问题解决思路
- 修正信号量初始值:
empty信号量代表队列的空闲位置数,初始值应设为队列最大容量MAX_SIZE而非1,这样才能让队列最多存放5个元素,符合设定要求。 - 添加结束标记机制:生产者完成所有元素生产后,向队列中放入与消费者数量一致的结束标记(比如
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
相关产品推荐
相关产品推荐

