"""
生产者消费者模型:模型目的是解决无线等待的问题
生产结束后,消费者将现有的东西消费掉后,整个程序结束

多进程实现
"""
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("生产结束")
    # 因为生产者内部,一直等待队列空才会退出,所以生产结束意味着全部结束了
Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐