进程的队列通信——消费者生产者的模型

from multiprocessing import Process, JoinableQueue
import time


def shop(q, shopping):
    for i in range(10):
        q.put('包子')
        print('%s 好了 %s' % (shopping, i))


def person(q):
    while True:
        food = q.get()
        print('客户吃了一个%s' % food)
        q.task_done()

错误案例:

if __name__ == '__main__':
    q = JoinableQueue()
    q1 = Process(target=shop, args=(q, 'egon'))
    q2 = Process(target=shop, args=(q, 'alex'))
    c1 = Process(target=person, args=(q,))
    q1.start()
    q2.start()
    c1.daemon = True
    c1.start()
    time.sleep(0.65)
    # print(q.get_nowait())  # 这样写发现,q是空的,因为此时,进程q1,q2还没往队列中添加值,所以此时,q.join()是完成的,直接主程序完成,所以,c1 根本没来得及执行就结束了
    q.join()               # 说明代码的执行远远快于 进程 的创建和执行。所以,要等 进程 q1,q2 完成后,在执行q.join()
                           # 加上time.sleep(0.5)程序可以部分的运行正常,即 进程 q1,q2 在这段时间已经完成了一部分添加。但是可能会提前取完
                           # 如图所示
    print('主程序')

正确案例:

if __name__ == '__main__':
    q = JoinableQueue()
    q1 = Process(target=shop, args=(q, 'egon'))
    q2 = Process(target=shop, args=(q, 'alex'))
    c1 = Process(target=person, args=(q,))
    q1.start()
    q2.start()
    c1.daemon = True  # 这里设置 进程 c1 是主程序的守护进程
    c1.start()
    q1.join()  # 要在进程 q1q2 将数据添加完成后,再判断 q 是否所有数据都取出,也就是 进程 c1 是否可以结束了,
    q2.join()  
    q.join()

    print('主程序')
posted @   pythoner_wl  阅读(103)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示