Python生产者与消费者模型

1、
# coding : UTF-8
import threading, time     # 导入相关模块
class Message: # 数据的描述类型
    def __init__(self): # 构造方法
        self.__title = None # 初始化属性
        self.__content = None # 初始化属性
    def set_info(self, title, content): # 进行属性内容的设置
        self.__title = title # 设置属性内容
        time.sleep(1) # 进行操作的生产延迟
        self.__content = content # 设置属性内容
        print("【%s】title = %s、content = %s" % (threading.current_thread().name, self.__title, self.__content))
    def __str__(self): # 获取数据将由消费者负责
        time.sleep(0.8) # 消费者的延迟时间短
        return "〖%s〗title = %s、content = %s" % (threading.current_thread().name, self.__title, self.__content)
def producer_handle(message): # 生产者处理函数
    for num in range(50): # 生产50组数据
        if num % 2 == 0 : # 交替生产
            message.set_info("李兴华", "软件技术讲师")
        else:
            message.set_info("yootk", "www.yootk.com")
def consumer_handle(message): # 消费者处理函数
    for num in range(50):
        print(message) # 获取50次的数据
def main(): # 主函数
    message = Message() # 公共保存的数据对象
    producer_thread = threading.Thread(target=producer_handle, name="生产者线程", args=(message,))
    consumer_thread = threading.Thread(target=consumer_handle, name="消费者线程", args=(message,))
    producer_thread.start() # 启动线程
    consumer_thread.start() # 启动线程
if __name__ == "__main__": # 判断程序执行名称
    main() # 调用主函数

2、
# coding : UTF-8
import threading, time     # 导入相关模块
class Message: # 数据的描述类型
    def __init__(self, condition): # 构造方法
        self.__title = None # 初始化属性
        self.__content = None # 初始化属性
        self.__condition = condition # 获取同步锁
        # flag = True表示可以生产,但是不能够消费
        # flag = False表示可以消费,但是不能够生产
        self.__flag = True
    def set_info(self, title, content): # 进行属性内容的设置
        self.__condition.acquire() # 获取同步锁
        if self.__flag == False: # 不能够继续生产了,必须进行消费处理
            self.__condition.wait() # 当前的线程进入到阻塞状态
        # 如果现在可以生产则一定会执行如下的代码操作,进行数据的设置,同时修改flag标志(此时的flag = True)
        self.__title = title # 设置属性内容
        time.sleep(1) # 进行操作的生产延迟
        self.__content = content # 设置属性内容
        print("【%s】title = %s、content = %s" % (threading.current_thread().name, self.__title, self.__content))
        self.__flag = False # 现在已经生产过了
        self.__condition.notify() # 唤醒其他等待的线程
        self.__condition.release() # 释放锁
    def __str__(self): # 获取数据将由消费者负责
        self.__condition.acquire() # 获取锁
        if self.__flag == True: # 不是消费状态
            self.__condition.wait() # 等待生产者生产数据
        # 如果执行了如下的代码,则意味着不进行等待(flag = False)
        try:
            time.sleep(0.8) # 消费者的延迟时间短
            return "〖%s〗title = %s、content = %s" % (threading.current_thread().name, self.__title, self.__content)
        finally:
            self.__flag = True # 可以继续生产, 无法消费了
            self.__condition.notify()  # 唤醒其他等待的线程
            self.__condition.release()  # 释放锁
def producer_handle(message): # 生产者处理函数
    for num in range(50): # 生产50组数据
        if num % 2 == 0 : # 交替生产
            message.set_info("李", "软件技术讲师")
        else:
            message.set_info("yootk", "www.com")
def consumer_handle(message): # 消费者处理函数
    for num in range(50):
        print(message) # 获取50次的数据
def main(): # 主函数
    condition = threading.Condition() # 实例化条件锁
    message = Message(condition) # 公共保存的数据对象
    producer_thread = threading.Thread(target=producer_handle, name="生产者线程", args=(message,))
    consumer_thread = threading.Thread(target=consumer_handle, name="消费者线程", args=(message,))
    producer_thread.start() # 启动线程
    consumer_thread.start() # 启动线程
if __name__ == "__main__": # 判断程序执行名称
    main() # 调用主函数

3、

# coding : UTF-8
import threading, time, queue     # 导入相关模块
class Message: # 数据的描述类型
    def __init__(self): # 构造方法
        self.__title = None # 初始化属性
        self.__content = None # 初始化属性
    def set_info(self, title, content): # 进行属性内容的设置
        self.__title = title # 设置属性内容
        time.sleep(0.1) # 进行操作的生产延迟
        self.__content = content # 设置属性内容
        print("【%s】title = %s、content = %s" % (threading.current_thread().name, self.__title, self.__content))
    def __str__(self): # 获取数据将由消费者负责
        time.sleep(0.8) # 消费者的延迟时间短
        return "〖%s〗title = %s、content = %s" % (threading.current_thread().name, self.__title, self.__content)
def producer_handle(worker_queue): # 生产者处理函数
    for num in range(50): # 生产50组数据
        message = Message() # 定义生产数据的包装类型
        if num % 2 == 0 : # 交替生产
            message.set_info("李兴华", "软件技术讲师")
        else:
            message.set_info("ww", "www.com")
        worker_queue.put(message) # 将生产后的数据放到队列之中
def consumer_handle(worker_queue): # 消费者处理函数
    for num in range(50):
        print(worker_queue.get()) # 通过队列获取数据
def main(): # 主函数
    worker_queue = queue.Queue(5) # 定义一个5个大小的队列
    producer_thread = threading.Thread(target=producer_handle, name="生产者线程", args=(worker_queue,))
    consumer_thread = threading.Thread(target=consumer_handle, name="消费者线程", args=(worker_queue,))
    producer_thread.start() # 启动线程
    consumer_thread.start() # 启动线程
if __name__ == "__main__": # 判断程序执行名称
    main() # 调用主函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/185524.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

陈嘉庚慈善践行与卓顺发的大爱传承

陈嘉庚慈善践行,了解陈嘉庚后人与卓顺发的大爱传承。 2023年11月25日,卓顺发太平绅士以及陈家后人在分享他们对慈善领域见解的过程中,特别强调了慈善在促进社会和谐以及推动社会进步方面的关键作用。同时,他们深入探讨了如何在当今社会中继续传扬和实践家国情怀以及…

清理docker Build Cache缓存文件

使用docker构建镜像,发现docker的overlay2文件会越来越大。 使用命令查看docker系统占用资源: docker system df 可以看到已经占用了26.7GB,清理这个缓存 docker builder prune 再次查看,已经没有缓存了,清理成功。 …

Linux基础操作二:Linux系统介绍

1、系统启动过程 Linux系统的启动过程并不是大家想象中的那么复杂,其过程可以分为5个阶段: 内核的引导。运行 init。系统初始化。建立终端 。用户登录系统。 1.1、内核引导 当计算机打开电源后,首先是BIOS开机自检,按照BIOS中…

固态继电器的分类:揭秘热门趋势

固态继电器(SSR)已成为现代电子和自动化系统不可或缺的一部分,与传统电磁继电器相比具有众多优势。随着技术的进步,SSR的分类不断发展,催生了令人兴奋的趋势和创新。在本文中,我们将探讨SSR分类的最新趋势,阐明该领域的…

10.索引

一.索引简介 索引用于快速找出在某个列中有一特定值的行。 不使用索引,MySQL必须从第1条记录开始读完整个表,直到找出相关的行。表越大,查询数据所花费的时间越多。 如果表中查询的列有一个索引,MySQL能快速到达某个位置去搜寻…

计算机毕业设计 基于Web的课程设计选题管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

css 字体倾斜

css 字体倾斜 //左右倾斜 transform: skew(40deg, 0deg);//上下倾斜 transform: skew(0deg, 16deg);

【代码】考虑区域多能源系统集群协同优化的联合需求侧响应模型(完美复现)

程序名称:考虑区域多能源系统集群协同优化的联合需求侧响应模型 实现平台:matlab-yalmip-cplex/gurobi 代码简介:风电、光伏发电等波动电源接入比例不断提高,使得区域多能源系统中能量转化和协调能力减弱。基于此,该…

面试:SpringMVC问题

文章目录 SpringMVC运行流程MVC的概念与请求在MVC中的执行路径,ResponsBody注解的用途SpringMVC启动流程SpringMVC的拦截器和过滤器有什么区别?执行顺序?Spring和SpringMVC为什么需要父子容器? SpringMVC运行流程 • 客户端&#…

Docker Swarm总结+Jenkins安装配置与集成snarqube和目标服务器(4/5)

博主介绍:Java领域优质创作者,博客之星城市赛道TOP20、专注于前端流行技术框架、Java后端技术领域、项目实战运维以及GIS地理信息领域。 🍅文末获取源码下载地址🍅 👇🏻 精彩专栏推荐订阅👇🏻…

海外热门:香港服务器和美国服务器的成本较量

​  提到 2023 年海外热门服务器,在整个 IDC 站长圈中,要数香港服务器和美国服务器的关注度一直居高不下。其实也正常,毕竟这两种海外服务器相较成熟。不过,在实际使用中,两者也会被拿来对比,最显而易见的…

Python多线程优化:提升程序性能的实例

更多Python学习内容:ipengtao.com 大家好,我是涛哥,今天为大家分享 Python多线程优化:提升程序性能的实例,全文5600字,阅读大约16钟。 多线程是一种有效的并发编程方式,能够提高程序的性能。本文…

(六)基于高尔夫优化算法GOA求解无人机三维路径规划研究(MATLAB代码)

一、无人机模型简介: 单个无人机三维路径规划问题及其建模_IT猿手的博客-CSDN博客 参考文献: [1]胡观凯,钟建华,李永正,黎万洪.基于IPSO-GA算法的无人机三维路径规划[J].现代电子技术,2023,46(07):115-120 二、高尔夫优化算法GOA简介 高尔夫优化算法…

c++——取地址(引用)和取内容(解引用)操作

今天又做蒙了一道题,把思考和实验记录下来。 struct sk{ int a; float b;}data; int *p; 若要使p指向data中的a域,正确的赋值语句是 p&a; pdata.a; p&data.a; *pdata.a前两个可以很容易看出错误之处,a是结构体内的变量,需…

P0级事故频发后,这家公司终于醒悟了!

近期,国内的互联网大厂接连爆发P0级事件,阿里云崩完滴滴崩,企业在追求效益的前提是业务的连续和稳定。如果发生故障不能快速恢复,引发业务中断,给企业带来的损失是巨大的,换言之,企业需要一套清…

OFDM通信连路仿真学习

文章目录 前言一、前置知识1、块状导频与梳状导频①、相似点②、区别③、其他 2、其他知识 二、仿真任务及方案1、仿真任务2、仿真方案 三、MATLAB仿真1、MATLAB 源码2、程序流程3、仿真结果①、打印信息③、8PSK 星座图②、脉冲成型图③、ETU300登加AWGN信道下误比特率曲线 四…

Windows系统搭建Appium 2 和 Appium Inspector 环境

前言 自 2022 年 1 月 1 日起,Appium 核心团队不再维护 Appium 1.x。官方支持的平台驱动程序的所有最新版本均不兼容 Appium 1.x,需要 Appium 2 才能运行。 Appium 2是一个自动化移动应用程序的开源工具,它带来了以下重要改进:  …

PowerDesigner数据库建模软件的安装

解压: 解压好以后,点击PowerDesigner.exe安装 这个安装的版本是15 选择安装路径,可以默认可以自定义: 直接点next: 全选了 点击next: 点击next: 点finish 汉化: 先把pojie和汉化文件…

Redis:主从复制

目录 概念配置步骤通过命令配置主从复制原理薪火相传反客为主哨兵(Sentinel)模式原理配置SpringBoot整合Sentinel模式 概念 主机更新后根据配置和策略,自动同步到备机的master/slave机制,Master以写为主,Slave以读为主。 作用: …

JVM 字节码

JVM概述 问题引出 你是否也遇到过这些问题? 运行着的线上系统突然卡死,系统无法访问,甚至直接OOM!想解决线上JVM GC问题,但却无从下手。新项目上线,对各种JVM参数设置一脸茫然,直接默认吧&…