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,否则返回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.运行结果

  • 19
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
生产者消费者模型是一种经典的并发编程模型,用于解决生产者和消费者之间的数据交换问题。在 Python 中,可以使用多线程或多进程实现生产者消费者模型。 下面是一个使用 Python 多线程实现生产者消费者模型的示例代码: ```python import threading import queue import time # 定义一个线程安全的队列 q = queue.Queue(maxsize=10) # 定义一个生产者线程 class Producer(threading.Thread): def run(self): while True: # 如果队列未满,则向队列中添加数据 if not q.full(): item = time.strftime('%H:%M:%S', time.localtime()) q.put(item) print(f'生产者 {self.name} 生产了 {item}') time.sleep(1) # 定义一个消费者线程 class Consumer(threading.Thread): def run(self): while True: # 如果队列不为空,则从队列中取出数据 if not q.empty(): item = q.get() print(f'消费者 {self.name} 消费了 {item}') time.sleep(2) if __name__ == '__main__': # 创建两个生产者线程和三个消费者线程 producers = [Producer() for i in range(2)] consumers = [Consumer() for i in range(3)] # 启动所有线程 for p in producers: p.start() for c in consumers: c.start() # 等待所有线程结束 for p in producers: p.join() for c in consumers: c.join() ``` 在上面的代码中,我们定义了一个线程安全的队列 `q`,并定义了一个生产者线程 `Producer` 和一个消费者线程 `Consumer`。生产者线程不断向队列中添加数据,消费者线程不断从队列中取出数据。我们创建了两个生产者线程和三个消费者线程,并启动所有线程。最后,我们使用 `join()` 方法等待所有线程执行完毕。运行上面的代码,可以看到生产者不断生产数据,消费者不断消费数据,实现了生产者消费者模型

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只程序猿子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值