Python JoinableQueue控制进程之间同步

 以下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()

原文:

Python 进程 消息JoinableQueue_一碗烈酒的博客-CSDN博客

你可能感兴趣的:(python,python,开发语言)