笔记-python-standard library-17.7 queue
笔记-python-standard library-17.7 queue
1. queue
source code:Lib/queue.py
该模块实现了多生产者,多消费者队列。
此模块实现了所有的required locking semantics.
模块支持三种类型的队列,区别仅仅在于检索的顺序。
三种队列分别是FIFO,LIFO,优先级队列(使用heaq模块,优先抛出最小值)。
1.1. 模块中定义的类
class queue.Queue(maxsize=0)
class queue.LifoQueue(maxsize=0)
class queue.PriorityQueue(maxsize=0)
注意:优先级队列中优先抛出最小值。
exception queue.Empty
Exception raised when non-blocking get() (or get_nowait()) is called on a Queue object which is empty.
exception queue.Full
Exception raised when non-blocking put() (or put_nowait()) is called on a Queue object which is full.
1.2. 类方法
三种队列类都提供了以下方法:
1. Queue.qsize()返回队列大致的大小,注意qsize()>0不代表get不会阻塞,同样,qsize()<maxsize不代表put不会阻塞
2. Queue.empty()
3. Queue.full()
4. Queue.put(item, block=True, timeout=None)
block决定是否阻塞,timeout决定最长阻塞时间
5. Queue.put_nowait(item)
6. Queue.get_nowait(): equal to get(False)
下面两个方法来跟踪队列中的任务是否被执行完。
7. Queue.task_done()
8. Queue.join()
阻塞直到队列中的所有任务完成。
其它属性
maxsize:队列最大长度,可以在初始化时给出,也可创建后手动设定。
1.1. productor and consumer
queue实现生产者与消费者
q = queue.Queue()
def productor(arg):
while True:
if q.qsize()
< 30:
q.put(str(arg)+'banana')
time.sleep(1)
def consumer(arg):
while True:
print('con {},
pro {}'.format(arg, q.get()))
time.sleep(2)
for i in range(3):
t = threading.Thread(target=productor,
args=(i,))
t.start()
for j in range(5):
t = threading.Thread(target=consumer,
args=(j,))
t.start()
1.2. task_done and join
文档如下:
def task_done(self):
'''Indicate that a formerly enqueued task is complete.
Used by Queue consumer threads.
For each get() used to fetch a task,
a subsequent call to task_done() tells the queue that the processing
on the task is complete.
If a join() is currently blocking, it will resume when all items
have been processed (meaning that a task_done() call was received
for every item that had been put() into the queue).
Raises a ValueError if called more times than there were items
placed in the queue.
'''
with self.all_tasks_done:
unfinished = self.unfinished_tasks - 1
if unfinished <= 0:
if unfinished < 0:
raise
ValueError('task_done() called too many times')
self.all_tasks_done.notify_all()
self.unfinished_tasks = unfinished
关键是如果不使用task_done,阻塞不会结束,
下面的代码把红色行删掉,线程会阻塞在q.join()处,
q = queue.Queue()
q.maxsize = 100
def productor(arg):
while True:
if q.qsize()
>50:
q.join()
else:
q.put(str(arg)+' banana')
time.sleep(0.5)
def consumer(arg):
while True:
print('con {},
pro {}'.format(arg, q.get()))
q.task_done()
time.sleep(2)
def start_t():
for i in range(4):
t = threading.Thread(target=productor,
args=(i,))
t.start()
for j in range(5):
t = threading.Thread(target=consumer,
args=(j,))
t.start()
time.sleep(1)
while True:
q_length = q.qsize()
if q_length
== 0:
pass
#break
else:
print("queue's
size is {}".format(q_length))
time.sleep(2)
start_t()
time.sleep(0.5)
print(r'end {}')
print(threading.enumerate())
2.
小结:
- queue是线程安全的
- FIFO实际使用的是dqueue,
- 在使用join时一定要使用task_done
笔记-python-standard library-17.7 queue的更多相关文章
- Python Standard Library
Python Standard Library "We'd like to pretend that 'Fredrik' is a role, but even hundreds of vo ...
- The Python Standard Library
The Python Standard Library¶ While The Python Language Reference describes the exact syntax and sema ...
- Python语言中对于json数据的编解码——Usage of json a Python standard library
一.概述 1.1 关于JSON数据格式 JSON (JavaScript Object Notation), specified by RFC 7159 (which obsoletes RFC 46 ...
- 《The Python Standard Library》——http模块阅读笔记1
官方文档:https://docs.python.org/3.5/library/http.html 偷个懒,截图如下: 即,http客户端编程一般用urllib.request库(主要用于“在这复杂 ...
- 《The Python Standard Library》——http模块阅读笔记2
http.server是用来构建HTTP服务器(web服务器)的模块,定义了许多相关的类. 创建及运行服务器的代码一般为: def run(server_class=HTTPServer, handl ...
- 《The Python Standard Library》——http模块阅读笔记3
http.cookies — HTTP state management http.cookies模块定义了一系列类来抽象cookies这个概念,一个HTTP状态管理机制.该模块支持string-on ...
- Python Standard Library 学习(一) -- Built-in Functions 内建函数
内建函数列表 Built-in Functions abs() divmod() input() open() staticmethod() all() enumerate() int() ord() ...
- python类库32[多进程通信Queue+Pipe+Value+Array]
多进程通信 queue和pipe的区别: pipe用来在两个进程间通信.queue用来在多个进程间实现通信. 此两种方法为所有系统多进程通信的基本方法,几乎所有的语言都支持此两种方法. 1)Queue ...
- [译]The Python Tutorial#11. Brief Tour of the Standard Library — Part II
[译]The Python Tutorial#Brief Tour of the Standard Library - Part II 第二部分介绍更多满足专业编程需求的高级模块,这些模块在小型脚本中 ...
- C++11新特性——The C++ standard library, 2nd Edition 笔记(一)
前言 这是我阅读<The C++ standard library, 2nd Edition>所做读书笔记的第一篇.这个系列基本上会以一章一篇的节奏来写,少数以C++03为主的章节会和其它 ...
随机推荐
- Centos 6/RHEL disable the IPv6 module.
http://minimallinux.blogspot.com/2013/07/centos-6rhel-disable-ipv6-module.html IPv6 was introduced t ...
- Sleep 和 Wait 关于锁释放的区别
sleep和wait的区别是一个老生常谈的问题.Sleep 是 Thread类的方法, wait是Object类的方法.但是关键的区别是对锁的操作问题. 当我们调用sleep的时候,线程进入休眠,但是 ...
- windows 2008 R2-Zabbix server 3.0监控主机的加入
一.关闭windows防火墙或者开通10050和10051端口 (1).关闭防火墙 开始—控制面板—windows防火墙 按照要求关闭防火墙 (2).开通端口 1.开始—管理工具--高级安全windo ...
- JavaScript 获取数组的最大值和最小值
js获取数组最大值和最小值 使用apply方法: var a = [1,2,3,5]; console.log(Math.max.apply(null, a));//最大值 console.log(M ...
- 去除Windows平台下每行代码的“^m”
有时在Windows里编写好的shell脚本放到Linux里不能运行了,打开编辑器显示正常,结果用vim打开发现每一行末尾都有^m,于是搜了一下解决办法. Windows上写好的文件,在Linux或者 ...
- ARM实验3 ——串口实验
uart串口实验 实验内容: 编写UART模块程序,通过串口将信息打印到终端. 实验目的: 熟悉开发环境的使用. 掌握exynos4412处理器的UART功能. 实验平台: FS4412开发板,ecl ...
- golang 2行代码在基于arm linux的树莓派、orangepi上运行http web服务
go语言(golang)简化了跨平台交叉编译步骤,支持在windows系统下交叉编译基于arm+linux平台的应用,运行时无需其它依赖库.以下以一个简单的http server为例,先上源码: ** ...
- IOS SVN源代码管理工具使用
01. 源代码管理工具概述(PPT)===================================================* 源代码管理工具的作用:# 能追踪一个项目从诞生一直到 ...
- 快算24点,POJ(3983)
题目链接:http://poj.org/problem?id=3983 中文题,就不解释题意了. 类似之前的一篇博客,这里也不上解释了,直接上代码吧. #include <iostream> ...
- 两次DFS,POJ(1481)
题目链接:http://poj.org/problem?id=1481 两次DFS,这里的思路是,没找到*,就说明,有一个骰子,因此,每搜索到一个*,深搜4个方向,并且变为'.',要是搜到'X',就是 ...