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)
上一篇 2021年11月11日 下午3:00
下一篇 2021年11月11日 下午3:00


相关推荐

  • 计算器原码、反码和补码和位移的一些总结

    计算器原码、反码和补码和位移的一些总结计算器原码 反码和补码的一些基础知识 来自百度百科的一些概念解释 在计算机系统中 数值一律用补码来表示和存储 原码一般是针对用户而言 补码是针对计算机的具体存储来使用 转换关系 1 正整数 负整数 转换如何转换为补码 a 正整数的补码是其二进制表示 与原码相同 例 1 9 的补码是 00001001 备注 这个 9 的补码是用 8 位 2 进制来表示的 补码表示方式很多 还有 16 位二

    2026年3月26日
    2
  • pycharm如何安装python环境_python+ pycharm 环境安装 + pycharm使用

    pycharm如何安装python环境_python+ pycharm 环境安装 + pycharm使用一 下载和安装 python1 可以搜索 python 官网找到官方链接点击进入 2 也可以用以下链接点击进入 https www python org 3 进入 python 后把鼠标移到 downloads 上 然后看到下拉选项 点击 Windows 因为这里是 Windows 系统所以选择 Windows 你是 Mac 就选择 Mac 4 这里全是迭代的历史版本号 我们选择最新的版本点击进入 5 进入后一直滑到最底下

    2026年3月27日
    2
  • 【笔记】ES6 模板字符串

    【笔记】ES6 模板字符串ES6中的字符串可以用反引号括起来用作模板字符串。conststr=`HelloWorld`console.log(str)//HelloWorld通过上面的例子,我们能感觉到,这个用反引号括起来跟单引号括起来貌似没有什么区别,那我们为什么要用模板字符串呢?那是因为我们还没有讲到模板字符串的特性。模板字符串内可以插入变量值和表达式//插入变量constmoon=’月亮’conststr1=`代表${moon}消灭你`console.log(str1)/.

    2022年8月21日
    29
  • JavaWeb – GET 请求中 URL 的最大长度限制(附:解决方案)[通俗易懂]

    JavaWeb – GET 请求中 URL 的最大长度限制(附:解决方案)[通俗易懂]今天在写一个PHP相应JSOUP请求的功能时,发现当URL中包含的请求参数过长时会返回414错误。浏览器1、IEIE浏览器(MicrosoftInternetExplorer)对URL长度限制是2083(2K+53),超过这个限制,则自动截断(若是form提交则提交按钮不起作用)。中文字符的话只有2083/9=231个字符。2、Firefoxfi…

    2022年8月24日
    20
  • 基于webkit内核webos系统架构

    基于webkit内核webos系统架构基于 webkit 内核 webos 系统架构 WebOS Web basedOperati 或者我们称为网络操作系统 是一种基于浏览器的虚拟的操作系统 用户通过浏览器可以在这个 WebOS 上进行应用程序的操作 而这个应用程序也不是普通的应用程序 是网络的应用程序 WebOS 提供面向网络的操作系统服务 包括 网络资源寻址 全球名称空间 远程执行程序 在客户端执行服务

    2026年3月20日
    2
  • VUE学习笔记

    VUE学习笔记

    2021年7月11日
    87

发表回复

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

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