Python 进程 消息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()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值