Python多线程笔记(三),queue模块
尽管在Python中可以使用各种锁和同步原语的组合编写非常传统的多线程程序,但有一种首推的编程方式要优于其他所有编程方式
即将多线程程序组织为多个独立人物的集合,这些任务之间通过消息队列进行通信
queue模块(在python2中叫Queue)实现了各种多生产者-多消费者队列,可用于在执行的多个线程之间安全地交换信息。
queue模块定义了三种不同的队列类
Queue([maxsize])
创造一个FIFO(first-in-first-out,先进先出)队列。maxsize是队列中可以放入的项的最大数量,如果省略maxsize
参数或将它置为0,队列大小将为无穷大。
LifoQueue([maxsize])
创建一个LIFO(last-in-first-out,后进先出)队列(也叫栈)
PriorityQueue([maxsize])
创建一个优先级队列,其中项按照优先级从低到高依次排列。使用这种队列时,项应该是(priority, data)形式的元组,
其中priority是一个数字。
队列类的实例q具有一下方法
q.qsize()
返回队列的正确大小。因为其他线程可能正在更新队列,此方法返回的数字不完全可靠
q.empty()
如果队列为空,返回True,否则返回False
q.full()
如果队列已满,返回True,否则返回False
q.put(item[,block [,timeout]])
将item放入队列。如果可选参数block为True(默认值),调用者将被阻塞直到队列中出现可用的空闲位置为止。
否则(block为False),队列满时将引发Full异常。timeout提供可选的超时值,单位为秒。如果出现超时,将引发
Full异常
q.put_nowait(item)
等价于q.put(item, False)方法
q.get(block [,timeout])
从队列中删除一项,然后返回这个项。如果可选参数block为True(默认值),调用者将阻塞,直到队列中出现可用的
空闲闲置。否则(block为False),队列为空将引发Empty异常。timeout提供可选的超时值,单位为秒。如果出现超时
将引发Empty异常。
q.get_nowait()
等价于get(0)方法
q.task_done()
队列中数据的消费数据用来指示对于项的处理已经结束。如果使用此方法,那么队列中删除的每一项都应该调用一次。
q.join()
阻塞直到队列中的所有项均被删除和处理为止。一旦为队列中的每一项都调用了一次q.task_done()方法,此方法将会直接返回。
- import threading
- from queue import Queue
- class WorkerThread(threading.Thread):
- def __init__(self, *args, **kwargs):
- threading.Thread.__init__(self, *args, **kwargs)
- self.input_queue = Queue()
- def send(self, item):
- self.input_queue.put(item)
- def close(self):
- self.input_queue.put(None)
- self.input_queue.join()
- def run(self):
- while True:
- item = self.input_queue.get()
- if item is None:
- break
- # 处理项(使用有用的工作代替)
- print(item)
- self.input_queue.task_done()
- # 完成,指示收到和返回了哨兵
- self.input_queue.task_done()
- return
- # 使用示例
- w = WorkerThread()
- w.start()
- w.send('hello') # 将项发给工作线程
- w.send('world')
- w.close()
- import queue
- import threading
- import time
- exitFlag = 0
- class MyThread (threading.Thread):
- def __init__(self, threadID, name, q):
- threading.Thread.__init__(self)
- self.threadID = threadID
- self.name = name
- self.q = q
- def run(self):
- print("开启线程:" + self.name)
- process_data(self.name, self.q)
- print("退出线程:" + self.name)
- def process_data(threadName, q):
- while not exitFlag:
- queueLock.acquire()
- if not workQueue.empty():
- data = q.get()
- queueLock.release()
- print("%s processing %s" % (threadName, data))
- else:
- queueLock.release()
- time.sleep(1)
- threadList = ["Thread-1", "Thread-2", "Thread-3"]
- nameList = ["One", "Two", "Three", "Four", "Five"]
- queueLock = threading.Lock()
- workQueue = queue.Queue(10)
- threads = []
- threadID = 1
- # 创建新线程
- for tName in threadList:
- thread = MyThread(threadID, tName, workQueue)
- thread.start()
- threads.append(thread)
- threadID += 1
- # 填充队列
- queueLock.acquire()
- for word in nameList:
- workQueue.put(word)
- queueLock.release()
- # 等待队列清空
- while not workQueue.empty():
- pass
- # 通知线程是时候退出
- exitFlag = 1
- # 等待所有线程完成
- for t in threads:
- t.join()
- print("退出主线程")
- # http://www.runoob.com/python3/python3-multithreading.html
Python多线程笔记(三),queue模块的更多相关文章
- Python学习笔记三:模块
一:模块 一个模块就是一个py文件,里面定义了一些业务函数.引用模块,可以用import语句导入.导入模块后,通过 模块.函数名(参数) 来使用模块中的函数.如果存在多个同名模块,则前面模块名需要加 ...
- python多线程(三)
原文:http://www.cnblogs.com/tqsummer/archive/2011/01/25/1944771.html 一.Python中的线程使用: Python中使用线程有两种方式: ...
- python学习笔记之常用模块(第五天)
参考老师的博客: 金角:http://www.cnblogs.com/alex3714/articles/5161349.html 银角:http://www.cnblogs.com/wupeiqi/ ...
- python学习笔记13(模块、包)
在Python中有一个概念叫做模块(module),比如在Python中要调用sqrt函数,必须用import关键字引入math这个模块,下面就来了解一下Python中的模块. 模块文件以.py后缀结 ...
- Python面试笔记三
1. 类继承 有如下的一段代码: python对象 如何调用类A的show方法了,方法如下: python对象 __class__方法指向了类对象,只用给他赋值类型A,然后调用方法show,但是用完了 ...
- Python学习笔记十_模块、第三方模块安装、模块导入
一.模块.包 1.模块 模块实质上就是一个python文件.它是用来组织代码的,意思就是把python代码写到里面,文件名就是模块的名称,test.py test就是模块的名称 2.包 包,packa ...
- python学习笔记(六):常用模块
一.模块.包 什么是模块? 模块实质上就是一个python文件,它是用来组织代码的,意思就是说把python代码写到里面,文件名就是模块的名称,test.py test就是模块名称. 什么是包? 包, ...
- python 学习笔记8 (模块)
Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句. 模块让你能够有逻辑地组织你的 Python 代码段. 把相关的代码 ...
- 吴裕雄--天生自然python学习笔记:Python3 模块
Python3 模块 在前面的几个章节中我们脚本上是用 python 解释器来编程,如果你从 Python 解释器退出再进入,那么你定义的所有的方法和变量就都消失了. 为此 Python 提供了一个办 ...
随机推荐
- 【自学系列一】HTML5大前端学习路线+视频教程(完整版)
今年,本公司全新发布了囊括Java.HTML5前端.大数据.Python爬虫.全链UI设计.软件测试.Unity 3D.Go语言等多个技术方向的全套视频. 面对这么多的知识点,有的盆友就麻爪了…… 我 ...
- 解决Html页面缓存
对于一个html页面,缓存分3部分,一个是页面内容,一个是css样式,一个是JS文件 CSS和JS文件缓存 <link rel="stylesheet" type=" ...
- Redis客户端、服务端的安装以及命令操作
目的: redis简介 redis服务端安装 redis客户端安装 redis相关命令操作 redis简介 官网下载(https://redis.io/) Redis 是完全开源免费的,遵守BSD协议 ...
- linux 磁盘占用的排查流程
Linux 服务器在使用过程中可能会遇到各种问题,其中之一就是"没有可用空间". 遇到这种情况,就需要进行排查,定位到消耗了磁盘的那个文件夹. 流程如下: 1. df -h df ...
- RMAN备份脚本执行遇到RMAN-03002,06091问题处理
一 问题描述 客户说RMAN备份脚本执行有的时候报错,有的时候正常!!! 远程登陆客户环境,查询最后一次备份的日志报错信息,得到 RMAN-03002: failure of delete comma ...
- google mock C++单元测试框架
转:google mock C++单元测试框架 2012-03-12 09:33:59 http://blog.chinaunix.net/uid-25748718-id-3129590.html G ...
- jenkins pipeline中获取shell命令的标准输出或者状态
//获取标准输出//第一种 result = sh returnStdout: true ,script: "<shell command>" result = res ...
- vue实现组件切换的两种方式
<!DOCTYPE html> <html> <head> <title>组件的切换</title> <meta charset=&q ...
- Ipython 和 python 的区别
IPython是一个python交互shell,它比默认的python shell更易于使用.它支持自动变量完成.自动缩进.bash shell命令,并且内置了许多有用的函数和函数. IPython是 ...
- poi 生成word 表格,并向表格单元格中插入多个图片
接这上一篇,导入数据,也要完整导出来.话不多说,直接上代码. 效果图 //根据实体对象 ,生成XWPFDocument public static XWPFDocument exportDataInf ...