加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python 生产者与消费者模型

发布时间:2020-12-20 10:38:07 所属栏目:Python 来源:网络整理
导读:基于队列实现生产者与消费者模型 import time import random from multiprocessing import Process from multiprocessing import Queue def consumer(q,name): while True: f = q.get() if f == None: break # 解决方法之一(比较笨) time.sleep(random.ran

基于队列实现生产者与消费者模型

import time
import random
from multiprocessing import Process
from multiprocessing import Queue

def consumer(q,name):
    while True:
        f = q.get()
        if f == None: break    # 解决方法之一(比较笨)
        time.sleep(random.randint(1,3))
        print(33[32m{}吃了{}33[0m.format(name,f))

def producer(q,name,food):
    for i in range(3):
        time.sleep(random.randint(1,3))
        f = {}生产了{}{}.format(name,food,i)   # 数据
        print(f)
        q.put(f)   # 往队列中添加数据
    q.put(None)   # 解决方法之一(比较笨)

if __name__ == __main__:
    q = Queue()
    p = Process(target=producer,args=(q,admin,馒头))
    c = Process(target=consumer,xp))
    p.start()
    c.start()
# 问题来了,生产者,队列中没有数据后,消费者一直处于阻塞状态,怎么解决?

上述代码中解决办法缺点:如果有N个消费者,是否还要生产者put进去N个None呢?

用JoinableQueue 解决消费者结束问题

import time
import random
from multiprocessing import Process
from multiprocessing import JoinableQueue

def consumer(q,name):
    while True:
        f1 = q.get()
        print(33[32m{}吃了{}33[0m.format(name,f1))
        time.sleep(random.randint(1,3))
        q.task_done()
#
#
def producer(q,food):
    for i in range(10):
        time.sleep(random.randint(1,3))
        f = {}生产了{}{}.format(name,i)
        q.put(f)
        print(f)
    q.join()

if __name__ == __main__:
    q = JoinableQueue()
    p1 = Process(target=producer,面条))
    c = Process(target=consumer,xp))
    c.daemon = True
    p1.start()
    c.start()
    p1.join()

是不是晕了,那就对了,代码执行顺序:

1、consumer 中把对列中所有的任务消耗完 q.task_done()

2、producer 端中的 q.join 感知到,停止阻塞

3、所有的producer 进程结束

4、主进程代码执行结束

5、守护进程结束

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读