Python生产者消费者模型

额滴名片儿

🎈 博主:一只程序猿子

🎈 博客主页:一只程序猿子 博客主页

🎈 个人介绍:爱好(bushi)编程!

🎈 创作不易:如喜欢麻烦您点个👍或者点个⭐

🎈 欢迎访问我的主页(点我直达)

🎈 除此之外您还可以通过个人名片联系我 👉👉👉👉👉👉

                              

如果您很喜欢我的文章且富有,我说:公主 or 王子 请打赏!!!

求打赏🥺

疯狂暗示👉👉👉👉👉👉👉👉👉👉👉👉👉👉👉👉👉

疯狂暗示👉👉👉👉👉👉👉👉👉👉👉👉👉👉👉👉👉

疯狂暗示👉👉👉👉👉👉👉👉👉👉👉👉👉👉👉👉👉

疯狂暗示👉👉👉👉👉👉👉👉👉👉👉👉👉👉👉👉👉

疯狂暗示👉👉👉👉👉👉👉👉👉👉👉👉👉👉👉👉👉

疯狂暗示👉👉👉👉👉👉👉👉👉👉👉👉👉👉👉👉👉

                       

目录

1.引言

2.生产者消费者模型

(1)什么是生产者消费者模型

(2)库介绍

3.代码示例

4.运行结果


1.引言

        在多线程编程中,生产者消费者模型是一种常见的并发模型。它由生产者线程、消费者线程以及一个共享的缓冲区组成,生产者负责生成数据并放入缓冲区,消费者负责从缓冲区中取出数据并进行处理。这种模型有效地解决了多线程之间的协作问题,实现了高效的资源利用和并发处理。本文将介绍如何使用Python实现生产者消费者模型。

2.生产者消费者模型

(1)什么是生产者消费者模型

        生产者消费者模型是一种解耦模型,生产者和消费者在不同的时间段内共用同一个存储空间。当生产者生产数据时,消费者可以同时从缓冲区中取出数据进行消费。这样,生产者和消费者之间相互解耦,不需要关心对方的存在,实现了高效的资源利用和并发处理。

(2)库介绍

Queue库: 

Queue库是Python标准库中的一部分,提供了实现多线程编程中线程安全队列的功能。在并发编程和多线程应用中,使用Queue可以很好地实现线程之间的安全数据传输和同步。

Queue模块提供了多种队列实现,其中最常用的是Queue。Queue支持多个生产者和消费者,并且内部自动实现了同步机制,保证线程安全。

总结来说,Queue库是Python中用于多线程编程的重要工具,能够实现线程间的安全数据传输和同步,提高程序的并发处理能力。

 Threading库:

threading库是Python标准库中的一个模块,它提供了一些简单的线程控制机制,用于实现多线程编程。线程是轻量级的,与进程相比,线程的创建和管理更加方便,因此在并发编程中,线程是非常重要的。threading库中提供了Thread类,可以创建多个线程,对于线程的状态进行控制,等待线程结束,同步线程等。

Thread类提供了以下方法:

  1. Thread(target=None, args=(), kwargs={}):创建一个实例并返回,参数target是要执行的函数名,argskwargs是该函数所需的参数。
  2. start():启动线程,调用该方法后,线程便开始运行。
  3. join(timeout=None):等待线程执行完毕,调用该方法后,主线程会等待该子线程执行完毕后再继续执行,timeout是超时时间。
  4. is_alive():判断线程是否在运行。

在使用threading库时,首先需要实例化一个Thread对象,并通过调用start()方法来启动线程。每个线程都可以执行一个特定的任务,这个任务通常是通过传入target参数指定的函数来完成的。当线程启动后,它将自动执行指定的函数。在主线程中,可以使用join()方法等待子线程执行完毕。通过使用is_alive()方法,可以判断线程是否仍在运行。

除了Thread类之外,threading库还提供了其他一些有用的方法和类,如Lock类和Semaphore类等,用于管理线程和实现线程同步等操作。

总之,threading库是Python中用于多线程编程的重要工具,它提供了一些简单的线程控制机制和相关的方法和类,可以帮助程序员轻松地实现多线程编程。

3.代码示例

producer-consumer_problem.py :

# 引入Python标准库中的queue模块,它提供了线程安全的队列实现
import queue
# 引入线程模块,它提供了创建和管理线程的功能
import threading
# 引入时间模块,它提供了各种时间相关的功能
import time# 定义一个名为ProducerThread的类,它继承自threading.Thread类,表示生产者线程
class ProducerThread(threading.Thread):# 定义类的初始化方法,它接受一个队列作为参数def __init__(self, queue):# 调用父类的初始化方法threading.Thread.__init__(self)# 将传入的队列保存到类的实例属性中,以便后面使用self.queue = queue# 定义类的运行方法,它表示生产者线程的运行逻辑def run(self):# 循环10次,每次生产一个数据并放入队列中for i in range(10):# 打印生产的数据print(f'生产者添加了一件商品: {i}')# 将数据放入队列中self.queue.put(i)# 暂停1秒钟,模拟生产数据的耗时操作time.sleep(1)# 定义一个名为ConsumerThread的类,它继承自threading.Thread类,表示消费者线程
class ConsumerThread(threading.Thread):# 定义类的初始化方法,它接受一个队列作为参数def __init__(self, queue):# 调用父类的初始化方法threading.Thread.__init__(self)# 将传入的队列保存到类的实例属性中,以便后面使用self.queue = queue# 定义类的运行方法,它表示消费者线程的运行逻辑def run(self):# 当队列不为空时,不断地从队列中取出数据并打印出来,然后暂停2秒钟模拟消费数据的耗时操作while True:# .empty()是一个用于检查容器(如列表、队列、集合、字典等)是否为空的函数或方法。# 它返回一个布尔值,如果容器为空,则返回True,否则返回Falseif not self.queue.empty():# 从队列中取出数据data = self.queue.get()# 打印消费的数据print(f'消费者消费了一件商品: {data}')# 暂停2秒钟time.sleep(2)# 消费者完成一个任务后,会通知队列queue任务已完成,以便其他线程可以继续工作self.queue.task_done()else:print("没有商品了")# 如果队列为空,则退出循环,表示消费者消费完毕breakif __name__ == '__main__':# 创建一个线程安全的队列对象,用于生产者和消费者之间的数据交换queue = queue.Queue()# 创建一个生产者线程对象并启动它producer = ProducerThread(queue)producer.start()# 创建一个消费者线程对象并启动它consumer1 = ConsumerThread(queue)consumer1.start()# 等待生产者线程结束producer.join()# 等待消费者线程结束consumer1.join()

4.运行结果

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

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

相关文章

为什么SSL证书要设有有效期?

在当今的数字化时代,网络安全已经成为了每个企业和个人都必须关注的重要问题。为了保护网站数据的安全传输,SSL证书应运而生。然而,你是否注意到,SSL证书并不是永久有效的,而是有一定的有效期。那么,为什么…

ZooKeeper 如何保证数据一致性?

在分布式场景中,ZooKeeper 的应用非常广泛,比如数据发布和订阅、命名服务、配置中心、注册中心、分布式锁等。 ZooKeeper 提供了一个类似于 Linux 文件系统的数据模型,和基于 Watcher 机制的分布式事件通知,这些特性都依赖 ZooKee…

【数据结构初阶(5)】链式队列的基本操作实现

文章目录 队列的定义初始化队列队尾入队列队头出队列取队头元素取队尾元素获取队列有效元素个数判断队空销毁队列 因为队列比较简单,关于队列的概念就不过多赘述了,本文只讲链队的基本操作实现 队列的定义 定义队列结点结构 链队中的每个结点都应该包…

hutool的bug之 DateUtil.endOfDay(DateUtil.date())

hutool 工具类DateUtil 使用时谨慎 DateUtil.endOfDay 得到的时间保存到数据时会增加一秒 首先比较下时间的long值: 这样就很明显的看出来,hutool工具类的date是毫秒位多了.999,保存到mysql 的时候,MySQL数据库对于毫秒大于500的数据进行…

算法通关村第十六关-白银挑战滑动窗口经典题目

大家好我是苏麟 , 今天带来滑动窗口经典的一些题目 . 我们继续来研究一些热门的、高频的滑动窗口问题 大纲 最长子串专题无重复字符的最长子串 长度最小的子数组盛最多水的容器 最长子串专题 无重复字符的最长子串 描述 : 给定一个字符串 s ,请你找出其中不含有重…

贸易公司ERP用什么软件好

不同行业的贸易公司有不同的业务结构和管理模式,日常经营管理过程中遇到的难点呈现多样化,而很多贸易公司在仓库、财务、销售、采购、订单、客户等业务一体化和部门协同效率等方面还有很多提升空间。 有些贸易公司涉及多仓库、多门店、多税制、多汇率、…

如何绕过某讯手游保护系统并从内存中获取Unity3D引擎的Dll文件

​ 某讯的手游保护系统用的都是一套,在其官宣的手游加固功能中有一项宣传是对比较热门的Unity3d引擎的手游保护方案,其中对Dll文件的保护介绍如下, “Dll加固混淆针对Unity游戏,对Dll模块的变量名、函数名、类名进行加密混淆处理&…

CSS实现小球边界碰撞回弹

如何通过CSS实现一个物体在屏幕中无限的边界碰撞回弹呢?我们可以使用动画效果实现 代码 我们只做一个小球,通过定位属性叠加动画的方式, 让小球在屏幕中进行运动,通过设置animation的alternate属性来设置回弹。最后,只…

笔记-基于CH579M模块通过网线直连电脑进行数据收发(无需网络)

刚学习,做个记录。 基于CH579M模块通过网线直连电脑进行数据收发(无需网络) 目录 一、工具1、CH579模块2、 网线3、电脑以及网络调试工具 二、操作步骤1、TCP/UDP等程序下载以及设置以太网IP2、网络断开3、检查以太网是否正常显示并稳定4、打开网络调试助手进行测试…

电气间隙和爬电距离的算法

电气间隙和爬电距离 一、定义 1、电气间隙:不同电位的两个导电部件间最短的空间直线距离。 2、爬电距离:不同电位的两个导电部件之间沿绝缘材料表面的最短距离。 3、隔离距离(机械式开关电器一个极的):满足对隔离器…

音频处理关键知识点

1 引言 现实生活中,我们听到的声音都是时间连续的,我们称为这种信号叫模拟信号。模拟信号需要进行数字化以后才能在计算机中使用。 目前我们在计算机上进行音频播放都需要依赖于音频文件。音频文件的生成过程是将声音信息采样、量化和编码产生的数字信号…

echarts笔记-GeoJSON河北数据下并裁剪为冀北地图并使用echarts加载

首先找个网站把河北的GeoJSON数据下载下来,我用的是这个,理论上任意一个都可以 DataV.GeoAtlas地理小工具系列 将json数据下载后,进行裁剪,仅保留冀北数据。 如下,我裁剪的数据: {"type": &qu…

Python练习题(四)

本文主要是【Python】——Python练习题的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 🌄每日一句:狠狠沉淀&a…

ssm医院门诊互联电子病历管理信息系统源码和论文

摘 要 网络的广泛应用给生活带来了十分的便利。所以把医院门诊互联电子病历管理与现在网络相结合,利用java技术建设医院门诊互联电子病历管理信息系统,实现医院门诊互联电子病历的信息化。则对于进一步提高医院门诊互联电子病历管理发展,对…

最强Node js 后端框架学习看这一篇文章就够

距离上次认真花时间写作,似乎已经过了许久许久,前端讲了一个新框架 ,叫 Nest.js 下方是课件,有过一定开发经验可跟随视频学习 B站 地址 : https://www.bilibili.com/video/BV1Lg4y197u1/?vd_sourcead427ffaf8a5c8344…

leetcode 202.快乐数

代码: class Solution {//计算 n 每个位置上的数字的平方和public int quadraticSum(int n){int sum0;while (n>0){int in%10;sumi*i;n/10;}return sum;}public boolean isHappy(int n) {//慢指针int slown;//快指针int fastquadraticSum(n);while (slow!fast){…

【EasyExcel实践】万能导出,一个接口导出多张表以及任意字段(可指定字段顺序)

文章目录 前言正文一、POM依赖二、核心Java文件2.1 自定义表头注解 ExcelColumnTitle2.2 自定义标题头的映射接口2.3 自定义有序map存储表内数据2.4 表头工厂2.5 表flag和表头映射枚举2.6 测试用的实体2.6.1 NameAndFactoryDemo2.6.2 StudentDemo 2.7 启动类2.8 测试控制器 三、…

linux作业管理_jobs

4.2 作业管理 是指控制当前正在运行的进程的行为,也称为进程控制。 是shell的一个特性,使用户能在多个独立进程间进行切换。 例如,用户可以挂起一个正在运行的进程,稍后再恢复其运行。当用户使用vim编辑一个文本文件&#xff0c…

PCL 空间直角坐标系与极坐标系的相互转换(C++详细过程版)

目录 一、算法原理1、空间坐标系转极坐标系2、极坐标系转空间坐标系二、代码实现三、结果展示1、空间坐标系转极坐标系2、极坐标系转空间坐标系本文由CSDN点云侠原创,原文链接。爬虫网站自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不

【算法】单调栈题单(矩阵系列、字典序最小、贡献法)⭐

文章目录 题单来源经典题单496. 下一个更大元素 I(单调栈模板题)503. 下一个更大元素 II(单调栈循环数组)2454. 下一个更大元素 IV(第二个更大的元素:两个单调栈)456. 132 模式(单调…