python 构造生产者消费者模型

python 构造生产者消费者模型

生产者消费者模型 的建立需要借助第三方进行传递信息。那么使用什么充当这个第三方进行传递信息能够使得生产者消费者模型能够效率更高,实现更为简单呢?

这里使用队列作为这个第三方进行传递信息,连同生产者与消费者。(队列:管道+锁),既能够传递信息,同时也能够保证数据安全。

普通版

import time
import random
from multiprocessing import Process,Queue

""" 生产者消费者初级模型 """

def producer(name,food,q):
    for i in range(5):
        data = "{}生产了{}{}".format(name,food,i)      # 生产者生产食品
        time.sleep(random.randint(1,3))          # 模拟网络或者其他的延迟,没有什么是处于完全理想状态
        print(data)
        q.put(data)


def consumer(name,q):
    while True:
        food = q.get()          # 从队列中取出数据
        # 判断队列中数据是否已经取出完毕,需要提前在队列中插入表示数据
        if food is None: break
        time.sleep(random.randint(1,3))  # 模拟时间延迟(网络延迟)
        print("{}处理掉了{}".format(name,food))


if __name__ == '__main__':
    q = Queue()
    p1 = Process(target=producer, args=("生产者1", '寿司', q))
    p2 = Process(target=producer, args=("生产者2", '寿司', q))
    c1 = Process(target=consumer, args=("消费者1", q))
    c2 = Process(target=consumer, args=("消费者2", q))
    p1.start()
    p2.start()
    c1.start()
    c2.start()

    # 等待进程运行结束之后,在队列中插入标识生产结束
    p1.join()
    p2.join()
    # 插入的标识的数量需要根据消费者数量进行确定
    q.put(None)
    q.put(None)

这是直接使用多进程里面的模块队列进行传递信息,使得生产者与消费者进行连同,但是这个模型存在一个缺点,那就需要为队列插入特定的结束标识,同时需要确定消费者的数量,插入对应数量的结束标识,同时也需要等待生产者进程运行结束,之后才能插入标识数据,不然会导致进程提前中止。

进阶版

import time
import random
from multiprocessing import Process,Queue,JoinableQueue

""" 生产者消费者进阶模型 """

def producer(name,food,q):
    for i in range(5):
        data = "{}生产了{}{}".format(name,food,i)      # 生产者生产食品
        time.sleep(random.randint(1,3))          # 模拟网络或者其他的延迟,没有什么是处于完全理想状态
        print(data)
        q.put(data)


def consumer(name,q):
    while True:
        food = q.get()          # 从队列中取出数据
        time.sleep(random.randint(1,3))  # 模拟时间延迟(网络延迟)
        print("{}处理掉了{}".format(name,food))
        q.task_done()        # 对队列中的数据的计数减一


if __name__ == '__main__':
    q = JoinableQueue()
    p1 = Process(target=producer, args=("生产者1", '寿司', q))
    p2 = Process(target=producer, args=("生产者2", '寿司', q))
    c1 = Process(target=consumer, args=("消费者1", q))
    c2 = Process(target=consumer, args=("消费者2", q))
    p1.start()
    p2.start()
    # 因为当数据被取出完全的时候,消费者还会在等待取数据,这时候需要守护进程的出现
    c1.daemon = True
    c2.daemon = True
    c1.start()
    c2.start()

    q.join()        # 等待队列中的数据被取出完全

    """ JoinableQueue 这个队列的机制与python的垃圾回收机制中的引用计数相类似 当往队列中插入一个数据时候,计数自动加一, 当调用.task_done()方法使用,对队列的计算进行减一操作; .join()方法与进程中的一样都是阻塞等待,等待队列中的计算清零,才继续运行 """

这样子不但解决了需要设置结束标志,同时也解决了消费者数量的问题。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115133.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • keras 学习率设置「建议收藏」

    keras 学习率设置「建议收藏」转载自https://blog.csdn.net/zzc15806/article/details/79711114Keras提供两种学习率适应方法,可通过回调函数实现。1.LearningRateSchedulerkeras.callbacks.LearningRateScheduler(schedule)该回调函数是学习率调度器.参数   schedule:函数,该函数…

    2022年5月23日
  • python模拟键盘输入_python控制鼠标键盘

    python模拟键盘输入_python控制鼠标键盘win32api.keybd_event该函数原型:keybd_event(bVk,bScan,dwFlags,dwExtraInfo)第一个参数:虚拟键码(键盘键码对照表见附录);第二个参数:硬件扫描码,一般设置为0即可;第三个参数:函数操作的一个标志位,如果值为KEYEVENTF_EXTENDEDKEY则该键被按下,也可设置为0即可,如果值为KEYEVENTF_KEYUP则该按键被释放;…

    2022年10月11日
  • C#–winform界面美化[通俗易懂]

    C#–winform界面美化[通俗易懂]1、工控上位机界面总结(参考贴:https://blog.csdn.net/zqrhzyj/article/details/76638948)一般的工控界面分成三部分:(1)、标题菜单部分,即项目名称、界面菜单等(2)、数据显示及按钮等部分,即图形显示区,可以显示工艺流程图,采集到的相关数据信息、控制按钮等。(3)、尾部部分,可以添加公司的相关信息等。…

    2022年5月28日
  • oracle 存储过程打印语句,oracle 存储过程语句总结[通俗易懂]

    oracle 存储过程打印语句,oracle 存储过程语句总结[通俗易懂]1、ExitWhen循环:createorreplaceprocedureproc_test_exit_whenisinumber;begini:=0;LOOPExitWhen(i>5);Dbms_Output.put_line(i);i:=i+1;ENDLOOP;endproc_test_exit_when;createorreplaceprocedureproc_te…

    2022年7月17日
  • freebsd分片重组算法_mongodb分片算法

    freebsd分片重组算法_mongodb分片算法Q:你们redis怎么做的分布式A:我们公司redis用的murmurHash做的分片;Q:讲讲murmurHash的原理呗A:额……这块没有深入了解过(真TM掉分)哈希算法简单来说就是将一个元素映射成另一个元素,可以简单分类两类,加密哈希,如MD5,SHA256等,非加密哈希,如MurMurHash,CRC32,DJB等。这里说说Jedis中的Shard是如何使用一致性hash的首先是hash函数,在Jedis中有两种Hash算法可供选择,分别是MurMurHash和MD5.按照.

    2022年10月9日
  • python3中urlopen_Python3 urlopen()用法示例[通俗易懂]

    对python这个高级语言感兴趣的小伙伴,下面一起跟随编程之家jb51.cc的小编两巴掌来看看吧!一.简介urllib.request.urlopen()函数用于实现对目标url的访问。函数原型如下:urllib.request.urlopen(url,data=None,[timeout,]*,cafile=None,capath=None,cadefault=False,context=N…

    2022年4月7日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号