`
finux
  • 浏览: 202167 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

threading模块学习--生产者与消费者

阅读更多

翻阅Python的threading模块API文档,觉得既有Java的影子(如threading.Thread类及其start/run方法),又有pthread的影子(如threading.Lock/threading.Condition)。总得来说简单易掌握,呵呵,随手写个大学OS课程里面“生产者与消费者”的Test。

相关类及方法就不多解释了,直接参考threading的API文档吧。

#! /usr/bin/env python
# coding=utf-8

import threading
import time

class Container(object):
	def __init__(self, size = 10):
		self.size = size
		self.container = []
		self.condition = threading.Condition()
	
	def isEmpty(self):
		self.condition.acquire()
		size = len(self.container)
		self.condition.release()
		return size == 0

	def isFull(self):
		self.condition.acquire()
		size = len(self.container)
		self.condition.release()
		return size == self.size

	def add(self, obj):
		self.condition.acquire()
		while len(self.container) >= self.size:
			self.condition.wait()
		self.container.append(obj)
		self.condition.notifyAll()
		self.condition.release()
	
	def get(self):
		self.condition.acquire()
		while len(self.container) == 0:
			self.condition.wait()
		obj = self.container.pop(0)
		self.condition.release()
		return obj

class Producer(threading.Thread):
	def __init__(self, container, size, group = None, target = None, name = None, args = (), kwargs = {}):
		threading.Thread.__init__(self, group, target, name, args, kwargs)
		self.container = container
		self.size = size
		self.count = 0
	
	def produce(self):
		cur = threading.currentThread()
		# s = str(cur.ident) + " " +  cur.getName() +  " (" + str(self.count) + ')'
		s = cur.getName() +  " (" + str(self.count) + ')'
		return s 

	def run(self):
		while self.count < self.size:
			if not self.container.isFull():
				obj = self.produce()
				self.container.add(obj)
				self.count += 1
			time.sleep(1)

class Customer(threading.Thread):
	def __init__(self, container, size, group = None, target = None, name = None, args = (), kwargs = {}):
		threading.Thread.__init__(self, group, target, name, args, kwargs)
		self.container = container
		self.size = size
		self.count = 0
	
	def consume(self, obj):
		cur = threading.currentThread()
		# s = str(cur.ident) + ' ' + cur.getName() + ' (' + str(self.count) + '): ' + obj
		s = cur.getName() + ' (' + str(self.count) + '): ' + obj
		print s 
	
	def run(self):
		while self.count < self.size:
			self.consume(self.container.get())
			time.sleep(1)
			self.count += 1

def main():
	container = Container()
	p1 = Producer(container, 30, name = 'Producer 1')
	c1 = Customer(container, 10, name = 'Customer 1')
	c2 = Customer(container, 10, name = 'Customer 2')
	c3 = Customer(container, 10, name = 'Customer 3')
	c1.start()
	c2.start()
	c3.start()
	p1.start()

if __name__ == '__main__':
	main()
 
0
1
分享到:
评论

相关推荐

    生产者消费者演示程序

    通过对这个代码的分析和学习,我们可以更深入地理解多线程同步以及生产者消费者模式在实际应用中的实现方法。 总之,生产者消费者问题是多线程编程中的一个重要概念,它展示了如何通过同步机制来协调不同任务之间的...

    生产者消费者问题.zip

    在计算机科学中,生产者消费者问题是多线程编程中的一个经典问题,主要涉及资源的共享与协调。在这个问题中,"生产者"负责生成数据,而"消费者"则负责处理这些数据。为了确保生产者和消费者之间的有效协作,通常会...

    Python生产者-消费者模型实现:深入理解与代码示例

    生产者-消费者模型是多线程编程中的一个重要概念,它通过解耦生产和消费过程,提高了程序的并发性能和效率。在Python中,可以通过queue模块和threading模块来实现这一模型。本文提供的代码示例展示了如何使用这些...

    生产者消费者问题实验报告和代码实现

    生产者消费者问题是多线程编程中的一个经典案例,它展示了如何在并发环境下有效地管理资源,以避免数据竞争和死锁的发生。在这个实验报告和代码实现中,我们将深入探讨这一概念。 生产者消费者模型是一个用于解决多...

    生产者消费者为模型的多线程编程c#原创

    生产者消费者模型的关键在于同步和通信机制,这在C#中主要通过`System.Threading`命名空间中的类实现。例如,`Monitor`类用于线程同步,`Semaphore`或`SemaphoreSlim`用于控制资源访问数量,`Task`和`Task.Run`用于...

    生产者消费者

    生产者消费者模式是一种经典的多线程同步问题,它在计算机科学和编程中有着广泛的应用。这个模式主要用于解决数据处理过程中的资源协调问题,确保生产者(生成数据的线程)和消费者(消耗数据的线程)之间的工作平衡...

    用多线程同步方法解决生产者-消费者问题操作系统课设.doc

    【标题与描述】所涉及的知识点是“生产者-消费者问题”,这是一个经典的多线程同步问题,常见于操作系统课程设计中。在这个问题中,生产者线程负责生成数据,而消费者线程则负责消费这些数据。多线程同步是解决这类...

    操作系统生产者消费者课设

    8. **Python多线程编程**:Python中,`threading`模块提供了线程支持,`threading.Lock`可用来实现互斥锁,而`queue`模块则内置了线程安全的队列,可以简化生产者消费者问题的实现。 9. **Web应用**:Web部分可能...

    理解生产者消费者模型及在Python编程中的运用实例

    在Python中,可以通过`threading`和`queue`模块来实现生产者消费者模型。下面是一个使用队列实现简单生产者消费者模型的示例: ```python import time import threading from queue import Queue class Consumer...

    模拟PV操作同步机构

    在本例中,"从键盘上输入一组字符,由生产者每次读入一个字符供消费者输出",这正是生产者-消费者问题的一个具体应用场景。生产者线程读取用户输入的字符,然后将字符放入一个共享的数据结构(如队列),而消费者...

    python之生产者消费者模型实现详解

    此外,生产者消费者模型不仅适用于Python,它是一个通用的模型,可以用在任何需要生产与消费数据处理的场景中。在多线程编程中,理解生产者消费者模型对于处理并行计算、数据库操作、网络通信等方面的问题十分重要。...

    用Python的线程来解决生产者消费问题的示例

    在Python中解决生产者消费者问题通常会用到Python标准库中的`threading`模块,该模块提供了基本的构造块来创建线程以及管理线程间的同步。尤其在处理线程同步时,`threading`模块中的`Lock`类非常重要,它可以帮助...

    Python实现的生产者、消费者问题完整实例

    以下是一个简单的Python生产者消费者问题的实现: ```python import threading import time import random # 共享资源:缓冲池 buffer_pool = [] # 创建锁对象 lock = threading.Lock() class Producer(threading...

    详解Python 模拟实现生产者消费者模式的实例

    生产者消费者模式是一种多线程或并发编程中的经典设计模式,用于解决生产者(producer)与消费者(consumer)之间的同步问题。在这个模式中,生产者负责生成数据并放入缓冲区,而消费者则从缓冲区取出数据进行处理。...

    python条件变量之生产者与消费者操作实例分析

    ### Python条件变量之生产者与消费者操作实例分析 #### 一、引言 在多线程编程中,线程间的同步是非常重要的一个方面。当多个线程共享资源时,为了防止资源冲突,需要采取合适的同步机制来确保程序的正确运行。...

    ConsoleApp11.rar

    生产者-消费者模式的核心思想是将系统分为两个主要部分:生产者负责生成数据,而消费者则负责处理这些数据。这两个角色通过一个共享的缓冲区进行通信,确保生产不会超过消费的速度,反之亦然。在.NET 6中,我们可以...

    Python之两种模式的生产者消费者模型详解

    生产者消费者模型是一种经典的多线程或并发编程概念,用于解决资源共享问题。在这个模型中,生产者负责创建数据,而消费者则负责处理这些数据。Python 提供了几种实现这一模型的方法,本篇主要介绍了两种:使用 `...

    多线程模拟

    生产者-消费者问题是这样设定的:一个系统中有两个主要角色——生产者和消费者。生产者负责生成数据(产品),而消费者则负责消费这些数据。问题的关键在于,如何确保生产者不会过度生产以至于耗尽存储空间,同时...

    Python多线程编程(一):threading模块综述

    9. **Queue**:队列类,实现了线程安全的数据结构,适用于多生产者和多消费者的场景,提供了FIFO(先进先出),LIFO(后进先出)和优先级队列三种类型。 `Queue`类是多线程编程中非常重要的组件,它内置了锁机制,...

    python基础9_1-进程、线程、守护线程、全局解释器锁、生产者消费者模型

    生产者消费者模型是一种设计模式,其中生产者负责生成数据,消费者负责消费这些数据。在Python中,可以使用线程和Queue来实现这种模型,生产者将数据放入Queue,消费者从Queue中取出数据并处理。 【进程和线程的...

Global site tag (gtag.js) - Google Analytics