可问春风尔

导航

使用joinablequeue优化生产者消费者问题

#Joinablequeue队列
'''
put 存放
get 获取
task_done 计数器属性值-1
join 配合task_done使用,阻塞

put一次数据,队列的内置计数器属性值+1
get一次数据,通过task_done 让队列的内置计数器属性值-1
join:会根据队列计数器的属性值来判断是否阻塞或者放行
    队列计数器属性是等于0,代码不阻塞,放行
    队列计数器属性不等于0,代码阻塞
'''
# from multiprocessing import JoinableQueue
# jq=JoinableQueue()
# jq.put('高启强') #+1
# jq.put('安欣') #+2
# print(jq.get())
# print(jq.get())
#
# jq.task_done() #-1
# jq.task_done() #-1
# jq.join()
# print("代码执行结束")


# 使用joinablequeue改造生产者消费者模型
from multiprocessing import Process,JoinableQueue
import time,random

# 消费者模型
def consumer(q,name):
    while True:
        # 获取队列中的数据
        food=q.get()

        time.sleep(random.uniform(0.1,1))
        print('{}吃了{}'.format(name,food))
        #让队列的内置计数器属性-1
        q.task_done()

# 生产者模型

def producer(q,name,food):
    for i in range(5):
        time.sleep(random.uniform(0.1, 1))
        # 展示的生产数据
        print('{}生产了{}'.format(name,food+str(i)))
        #存储的生产数据
        q.put(food+str(i))
if __name__=='__main__':
    q=JoinableQueue()

    p1=Process(target=consumer,args=(q,'高启强'))
    p2=Process(target=producer,args=(q,'安欣','饺子'))

    p1.daemon=True
    p1.start()
    p2.start()
    p2.join()
    # 必须等待队列中的所有数据消费完毕,再放行
    q.join()

    print('程序结束')

 

posted on 2023-02-08 15:20  可问春风尔  阅读(25)  评论(0编辑  收藏  举报