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 复制代码
# 引入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.运行结果

相关推荐
StayInLove2 分钟前
G1垃圾回收器日志详解
java·开发语言
无尽的大道9 分钟前
Java字符串深度解析:String的实现、常量池与性能优化
java·开发语言·性能优化
爱吃生蚝的于勒13 分钟前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
binishuaio22 分钟前
Java 第11天 (git版本控制器基础用法)
java·开发语言·git
zz.YE24 分钟前
【Java SE】StringBuffer
java·开发语言
就是有点傻28 分钟前
WPF中的依赖属性
开发语言·wpf
洋24037 分钟前
C语言常用标准库函数
c语言·开发语言
进击的六角龙38 分钟前
Python中处理Excel的基本概念(如工作簿、工作表等)
开发语言·python·excel
wrx繁星点点40 分钟前
状态模式(State Pattern)详解
java·开发语言·ui·设计模式·状态模式
NoneCoder1 小时前
Java企业级开发系列(1)
java·开发语言·spring·团队开发·开发