当前位置: 首页 > article >正文

Python生产者消费者模型

额滴名片儿

🎈 博主:一只程序猿子

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

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

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

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

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

                              

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

求打赏🥺

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

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

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

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

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

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

                       

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,否则返回False
			if not self.queue.empty():
				# 从队列中取出数据
				data = self.queue.get()
				# 打印消费的数据
				print(f'消费者消费了一件商品: {data}')
				# 暂停2秒钟
				time.sleep(2)
				# 消费者完成一个任务后,会通知队列queue任务已完成,以便其他线程可以继续工作
				self.queue.task_done()
			else:
				print("没有商品了")
				# 如果队列为空,则退出循环,表示消费者消费完毕
				break


if __name__ == '__main__':
	# 创建一个线程安全的队列对象,用于生产者和消费者之间的数据交换
	queue = queue.Queue()

	# 创建一个生产者线程对象并启动它
	producer = ProducerThread(queue)
	producer.start()

	# 创建一个消费者线程对象并启动它
	consumer1 = ConsumerThread(queue)
	consumer1.start()


	# 等待生产者线程结束
	producer.join()
	# 等待消费者线程结束
	consumer1.join()

4.运行结果

 


http://www.kler.cn/a/155683.html

相关文章:

  • python实战(八)——情感识别(多分类)
  • 【系统设计】数据库压缩技术详解:从基础到实践(附Redis内存优化实战案例)
  • 11Java面向对象高级(篇2,Java程序的核心套路!!!!)
  • ubuntu cmake CPack将第三方库进行打包
  • 快速学习Serde包实现rust对象序列化
  • Labelme标注数据的一些操作
  • Zabbix 6.0 详细基础介绍
  • 充电桩新老国标兼容性分析
  • OpenCvSharp从入门到实践-(06)创建图像
  • 编译原理头歌实验:实验4《算符优先分析法设计与实现》(C语言版)
  • vue el-select封装及使用
  • Prefix-Tuning 论文概述
  • JAVA代码优化:记录日志
  • 使用AOS实现网页动画效果
  • 利用段落检索和生成模型进行开放域问答12.2
  • Spring Initial 脚手架国内镜像地址
  • C/C++学生选课/排课系统[2023-12-3]
  • 保育员个人简历精选7篇
  • C++笔试训练day_1
  • Linux网络之连接跟踪 conntrack
  • gitlab 代码提交账户信息修改
  • “大型”基础模型中幻觉的调查
  • 工程数学笔记 | 傅里叶级数/变换的本质理解
  • 1949-2021年全国31省铁路里程数据
  • Java数据结构之《构造哈夫曼树》题目
  • 项目设计---网页五子棋