Python并行编程(九):线程通讯queue
1、基本概念
当线程之间要共享资源或数据的时候,可能变的非常复杂。Python的threading模块提供了很多同步原语,包括信号量,条件变量,事件和锁。如果可以使用这些原语的话,应该优先考虑使用这些,而不是使用queue模块。队列操作起来更容易,也使多线程编程更安全,因为队列可以将资源的使用通过单线程进行完全控制,并且允许使用更加整洁和可读性更高的设计模式。
Queue常用的方法有以下四个:
- put():往queue中放一个item
- get():从queue删除一个item,并返回删除的这个item
- task_done():每次item被处理的时候需要调用这个方法
- join():所以item在被处理之前一直阻塞
2、代码示例
from threading import Thread, Event
from queue import Queue
import time
import random
class producer(Thread):
def __init__(self, queue):
Thread.__init__(self)
self.queue = queue
def run(self):
for i in range(10):
item = random.randint(0, 256)
self.queue.put(item)
print('Producer notify:item %d appended to queue by %s' %(item, self.name))
time.sleep(1) class consumer(Thread):
def __init__(self, queue):
Thread.__init__(self)
self.queue = queue def run(self):
while True:
item = self.queue.get()
print('Consumer notify: %d popped from queue by %s' %(item, self.name)) if __name__ == "__main__":
queue = Queue()
t1 = producer(queue)
t2 = consumer(queue)
t3 = consumer(queue)
t4 = consumer(queue)
t1.start()
t2.start()
t3.start()
t4.start()
t1.join()
t2.join()
t3.join()
t4.join()
生产者使用Queue.put(item [,block[, timeout]])往queue中插入数据,Queue是同步的,在插入数据之前内部有一个内置的锁机制。
可能发生的两种情况:
- 如果block为True,timeout为None(默认),那么可能会阻塞掉,直到出现可用的位置。如果timeout是正整数,那么阻塞直到这个时间,就会抛出一个异常。
- 如果block为False,如果队列有闲置那么会立即插入,否则就立即抛出异常(timeout将会被忽略),本例中,put()检查队列是否已满,然后调用wait()开始等待。
消费者从队列中取出整数然后用task_done()方法将其标位任务已处理。
消费者使用Queue.get([block[, timeout]])从队列中取回数据,queue内部也会经过锁的处理。如果队列为空,消费者阻塞。
3、流程图

Python并行编程(九):线程通讯queue的更多相关文章
- python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)
		python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程 并行与并发 同步与异步 阻塞与非阻塞 CPU密集型与IO密集型 线程与进程 进 ... 
- 《转载》Python并发编程之线程池/进程池--concurrent.futures模块
		本文转载自Python并发编程之线程池/进程池--concurrent.futures模块 一.关于concurrent.futures模块 Python标准库为我们提供了threading和mult ... 
- python并发编程之线程/协程
		python并发编程之线程/协程 part 4: 异步阻塞例子与生产者消费者模型 同步阻塞 调用函数必须等待结果\cpu没工作input sleep recv accept connect get 同 ... 
- Python并行编程(二):基于线程的并行
		1.介绍 软件应用中使用最广泛的并行编程范例是多线程.通常一个应用有一个进程,分成多个独立的线程,并行运行.互相配合,执行不同类型的任务. 线程是独立的处理流程,可以和系统的其他线程并行或并发地执行. ... 
- Python并行编程的几个要点
		一.基于线程的并行编程 如何使用Python的线程模块 如何定义一个线程 如何探测一个线程 如何在一个子类中使用线程 Lock和RLock实现线程同步 信号实现线程同步 条件(condition)实现 ... 
- python并行编程
		一.编程思想 并行编程的思想:分而治之,有两种模型 1.MapReduce:将任务划分为可并行的多个子任务,每个子任务完成后合并得到结果 例子:统计不同形状的个数. 先通过map进行映射到多个子任务, ... 
- Python并行编程(十四):异步编程
		1.基本概念 除了顺序执行和并行执行的模型以外,还有异步模型,这是事件驱动模型的基础.异步活动的执行模型可以只有一个单一的主控制流,能在单核心系统和多核心系统中运行. 在并发执行的异步模型中,许多任务 ... 
- Python并行编程(一):基本概念
		1.线程和进程 进程是应用程序的一个执行实例,比如,在桌面上双击浏览器将会运行一个浏览器.线程是一个控制流程,可以在进程内与其他活跃的线程同时执行.控制流程指的是顺序执行一些机器指令.进程可以包含多个 ... 
- python并行编程学习之绪论
		计算机科学的研究,不仅应该涵盖计算处理所基于的原理,还因该反映这些领域目前的知识状态.当今,计算机技术要求来自计算机科学所有分支的专业人员理解计算机处理的基础的关键,在于知道软件和硬件在所有层面上的交 ... 
随机推荐
- [TI-Sitara]启动流程
			前段时间在准备AM437x启动相关的一些事情,对MLO.SPL等事情也是有些糊涂,于是分享下面这篇文章 转自:http://blog.csdn.net/psvoldemort/article/deta ... 
- Android——Activity初学
			manifests里的AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> < ... 
- QQ会员活动运营平台架构设计实践——高效自动化运营
			QQ会员活动运营平台(AMS),是QQ会员增值运营业务的重要载体之一,承担海量活动运营的Web系统.在过去四年的时间里,AMS日请求量从200-500万的阶段,一直增长到日请求3-5亿,最高CGI日请 ... 
- ssh2——Interceptor拦截器
			尽管没学过struts1吧.可是了解到struts1中并没有拦截器, 到Struts2才有.它是基于WebWork发展起来的, 顾名思义,说到拦截器大家首先肯定会想到它是拦截东西的,起到一个限制的作 ... 
- 关于Unity中调试C#的方法
			1.断点输出语句 在感觉有问题的地方的上下文写一些输出语句,如果控制台只有输出上文,没有输出下文,那么可以知道,上下文之间的语句有问题,因为下文没执行到,没有输出语句. Debug.Log(" ... 
- php -- 设计模式 之 单例模式
			实现单例的条件:三私一公 三私:私有化构造方法:不让外部创建对象 私有化克隆方法:不让外部克隆对象 私有静态属性:保存已经产生的对象 一公:公共静态方法:在类内部创建对象 实例: <?php / ... 
- VC++ ListCtrl Report使用
			1.在VC++ 6.0中新建基于对话框的MFC应用程序ListCtrl; 2.在主对话框上添加一个List Control至合适的位置及大小: 3.在对话框OnInitDialog中初始化ListCt ... 
- js实现jquery的offset()
			用过jQuery的offset()的同学都知道 offset().top或offset().left很方便地取得元素相对于整个页面的偏移. 而在js里,没有这样直接的方法,节点的属性offsetTop ... 
- cookie是什么,在什么地方会用到
			1.它是由服务器存储在硬盘上一的上小型txt文件 2..cookie也可以理解为缓存,方便下次浏览,推介等作用 
- js修改剪切板内容的方法
			代码如下: //绑定在了body上,也可以绑定在其他可用元素行,但是不是所有元素都支持copy事件. $(document.body).bind({ copy: function(e) {//copy ... 
