栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python 多进程--生产者消费者模型

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python 多进程--生产者消费者模型

"""
生产者消费者模型:
生产结束后,消费者将现有的东西消费掉后,整个程序结束

多进程实现
"""
from multiprocessing import Process, JoinableQueue
import time, random, os


# 生产
# 模拟数据--放入--进程消息队列
def fun1(n, q):
    # 生产10个 时间随机1~3秒 生产一次
    for i in range(10):
        time.sleep(random.randint(1, 3))
        # 生产n 第i个
        res = "{}{}".format(n, i)
        # 查看子进程PID号,
        print("子进程号:{}生产:{}".format(os.getppid(), res))
        # 放入消息队列
        q.put(res)

    # 生产结束 阻塞直到队列为空
    q.join()


# 消费
# 模拟数据--获取--进程消息队列
def fun2(n, q):
    # 一直消费
    while True:
        res = q.get()
        # 消费 消耗随机1~3秒
        time.sleep(random.randint(1, 3))
        print("子进程号:{}-{}吃{}".format(os.getppid(), n, res))

        # 向q.join()发送一次信号,证明一个数据已经被取走了
        q.task_done()


if __name__ == '__main__':
    # 创建进程消息队列
    q = JoinableQueue()

    # 创建 多进程 生产
    p1 = Process(target=fun1, args=('葡萄', q))
    p2 = Process(target=fun1, args=('苹果', q))
    p3 = Process(target=fun1, args=('橘子', q))

    # 创建多进程 消费
    c1 = Process(target=fun2, args=('吃货1', q))
    c2 = Process(target=fun2, args=('吃货2', q))
    # 设置为守护进程:
    c1.daemon = True
    c2.daemon = True

    # 全部启动
    p_l = [p1, p2, p3, c1, c2]
    for p in p_l:
        p.start()

    # 等待生产进程结束
    p1.join()
    p2.join()
    p3.join()
    print("生产结束")
    # 因为生产者内部,一直等待队列空才会退出,所以生产结束意味着全部结束了
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/949727.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号