以下demo可以很好的理解JoinableQueue的用法
"""
JoinableQueue 消息类
必须在消息队列内的任务被消费(get)时,使用 task_down() 方法 发送被消费信号
"""
from multiprocessing import Process, JoinableQueue
import time
import os
def inputQ(queue, name):
"""加入队列"""
queue.put(name + str(os.getpid()) + " -- " + str(time.time())) # 当队列已满时,会阻塞,等待
print(name + "已生产 %d ,添加到队列, " % os.getpid())
def outputQ(queue):
"""从队列内取数据"""
data = queue.get() # 当队列内无数据时,会阻塞等待
queue.task_done() # 向q.join()发送一个数据被消费的信号
def add_queue(q, name):
for i in range(10):
inputQ(q, name)
q.join() # 生产完毕后,此方法会阻塞,直到队列内数据为空
print("已全部消费完了---------" + str(os.getpid()))
def delete_queue(q):
# 抽奖用户数比奖品数量多, 这种情况如果使用get()会阻塞
while True:
outputQ(q)
print(str(os.getpid()) + "已消费")
if __name__ == '__main__':
file_name = "data.txt"
record_in = []
record_out = []
q = JoinableQueue() # 默认队列无限长
p1 = Process(target=add_queue, args=(q, '猪蹄子'))
p2 = Process(target=add_queue, args=(q, '涮羊肉'))
p3 = Process(target=add_queue, args=(q, '羊蝎子'))
c1 = Process(target=delete_queue, args=(q,))
c2 = Process(target=delete_queue, args=(q,))
# 设置消费进程为守护进程,消费完毕后跟随主进程结束而结束
c1.daemon = True
c2.daemon = True
# 启动线程
p1.start()
p2.start()
p3.start()
c1.start()
c2.start()
# 等待生产结束
p1.join()
p2.join()
p3.join()
原文: