python标准库介绍——32 Queue 模块详解
Queue 模块 ``Queue`` 模块提供了一个线程安全的队列 (queue) 实现, 如 [Example 3-2 #eg-3-2] 所示.
你可以通过它在多个线程里安全访问同个对象. ====Example 3-2. 使用 Queue 模块====[eg-3-2] ```
File: queue-example-1.py import threading
import Queue
import time, random WORKERS = 2 class Worker(threading.Thread): def _ _init_ _(self, queue):
self._ _queue = queue
threading.Thread._ _init_ _(self) def run(self):
while 1:
item = self._ _queue.get()
if item is None:
break # reached end of queue # pretend we're doing something that takes 10?00 ms
time.sleep(random.randint(10, 100) / 1000.0) print "task", item, "finished" #
# try it queue = Queue.Queue(0) for i in range(WORKERS):
Worker(queue).start() # start a worker for i in range(10):
queue.put(i) for i in range(WORKERS):
queue.put(None) # add end-of-queue markers *B*task 1 finished
task 0 finished
task 3 finished
task 2 finished
task 4 finished
task 5 finished
task 7 finished
task 6 finished
task 9 finished
task 8 finished*b*
``` [Example 3-3 #eg-3-3] 展示了如何限制队列的大小. 如果队列满了,
那么控制主线程 (producer threads) 被阻塞, 等待项目被弹出 (pop off). ====Example 3-3. 使用限制大小的 Queue 模块====[eg-3-3] ```
File: queue-example-2.py import threading
import Queue import time, random WORKERS = 2 class Worker(threading.Thread): def _ _init_ _(self, queue):
self._ _queue = queue
threading.Thread._ _init_ _(self) def run(self):
while 1:
item = self._ _queue.get()
if item is None:
break # reached end of queue # pretend we're doing something that takes 10?00 ms
time.sleep(random.randint(10, 100) / 1000.0) print "task", item, "finished" #
# run with limited queue queue = Queue.Queue(3) for i in range(WORKERS):
Worker(queue).start() # start a worker for item in range(10):
print "push", item
queue.put(item) for i in range(WORKERS):
queue.put(None) # add end-of-queue markers *B*push 0
push 1
push 2
push 3
push 4
push 5
task 0 finished
push 6
task 1 finished
push 7
task 2 finished
push 8
task 3 finished
push 9
task 4 finished
task 6 finished
task 5 finished
task 7 finished
task 9 finished
task 8 finished*b*
``` 你可以通过继承 //Queue// 类来修改它的行为. [Example 3-4 #eg-3-4]
为我们展示了一个简单的具有优先级的队列. 它接受一个元组作为参数,
元组的第一个成员表示优先级(数值越小优先级越高). ====Example 3-4. 使用 Queue 模块实现优先级队列====[eg-3-4] ```
File: queue-example-3.py import Queue
import bisect Empty = Queue.Empty class PriorityQueue(Queue.Queue):
"Thread-safe priority queue" def _put(self, item):
# insert in order
bisect.insort(self.queue, item) #
# try it queue = PriorityQueue(0) # add items out of order
queue.put((20, "second"))
queue.put((10, "first"))
queue.put((30, "third")) # print queue contents
try:
while 1:
print queue.get_nowait()
except Empty:
pass *B*third
second
first*b*
``` [Example 3-5 #eg-3-5] 展示了一个简单的堆栈 (stack) 实现
(末尾添加, 头部弹出, 而非头部添加, 头部弹出). ====Example 3-5. 使用 Queue 模块实现一个堆栈====[eg-3-5] ```
File: queue-example-4.py import Queue Empty = Queue.Empty class Stack(Queue.Queue):
"Thread-safe stack" def _put(self, item):
# insert at the beginning of queue, not at the end
self.queue.insert(0, item) # method aliases
push = Queue.Queue.put
pop = Queue.Queue.get
pop_nowait = Queue.Queue.get_nowait #
# try it stack = Stack(0) # push items on stack
stack.push("first")
stack.push("second")
stack.push("third") # print stack contents
try:
while 1:
print stack.pop_nowait()
except Empty:
pass *B*third
second
first*b*
```
python标准库介绍——32 Queue 模块详解的更多相关文章
- python标准库介绍——27 random 模块详解
==random 模块== "Anyone who considers arithmetical methods of producing random digits is, of cour ...
- python标准库介绍——12 time 模块详解
==time 模块== ``time`` 模块提供了一些处理日期和一天内时间的函数. 它是建立在 C 运行时库的简单封装. 给定的日期和时间可以被表示为浮点型(从参考时间, 通常是 1970.1.1 ...
- python标准库介绍——10 sys 模块详解
==sys 模块== ``sys`` 模块提供了许多函数和变量来处理 Python 运行时环境的不同部分. === 处理命令行参数=== 在解释器启动后, ``argv`` 列表包含了传递给脚本的所有 ...
- python标准库介绍——30 code 模块详解
==code 模块== ``code`` 模块提供了一些用于模拟标准交互解释器行为的函数. ``compile_command`` 与内建 ``compile`` 函数行为相似, 但它会通过测试来保证 ...
- python标准库介绍——8 operator 模块详解
==operator 模块== ``operator`` 模块为 Python 提供了一个 "功能性" 的标准操作符接口. 当使用 ``map`` 以及 ``filter`` 一类 ...
- python标准库介绍——36 popen2 模块详解
==popen2 模块== ``popen2`` 模块允许你执行外部命令, 并通过流来分别访问它的 ``stdin`` 和 ``stdout`` ( 可能还有 ``stderr`` ). 在 pyth ...
- python标准库介绍——23 UserString 模块详解
==UserString 模块== (2.0 新增) ``UserString`` 模块包含两个类, //UserString// 和 //MutableString// . 前者是对标准字符串类型的 ...
- python标准库介绍——22 UserList 模块详解
==UserList 模块== ``UserList`` 模块包含了一个可继承的列表类 (事实上是对内建列表类型的 Python 封装). 在 [Example 2-16 #eg-2-16] 中, / ...
- python标准库介绍——21 UserDict 模块详解
==UserDict 模块== ``UserDict`` 模块包含了一个可继承的字典类 (事实上是对内建字典类型的 Python 封装). [Example 2-15 #eg-2-15] 展示了一个增 ...
随机推荐
- Sqlite和Mysql和SqlServer中insert … select … where not exist的用法
下面介绍Mysql和Sqlite和Sqlserver中,根据select的条件判断是否插入.例如: 一.Mysql中: INSERT INTO books (name) SELECT 'SongXin ...
- Vue为什么没有templateUrl
Why Vue.js doesn't support templateURL Vue.js为什么不支持templateUrl模式 原因 templateUrl使用ajax的方式在运行时加载templa ...
- [转] libtool的作用及应用
今天使用 autoconf 的时候遇到一个 libtool 的问题,觉得这个东西挺有意思,找了个文档过来,暂时记录. 转自:http://blog.csdn.net/larntin2002/artic ...
- Grunt、Gulp和Webpack对比
1.Grunt处理Sass转换成CSS过程 2.Gulp处理Sass转换成CSS过程 3.Webpack执行原理 4.区别 (1)grunt和gulp都类似于webapck的中的scripts,属于任 ...
- RHEL/CentOS/Fedora各种源
CentOS 默认自带 CentOS-Base.repo 源, 但官方源中去除了很多有版权争议的软件, 而且安装的软件也不是最新的稳定版. Fedora 自带的源中也找不到很多多媒体软件, 如果需要安 ...
- Java ThreadLocal (Java代码实战-006)
ThreadLocal解决什么问题 由于 ThreadLocal 支持范型,如 ThreadLocal< StringBuilder >,为表述方便,后文用 变量 代表 ThreadLoc ...
- UVA 10733 - The Colored Cubes(Ploya)
UVA 10733 - The Colored Cubes 题目链接 题意:一个立方体.n种颜色,问能涂成多少不同立方体 思路:Ploya求解,正方体相应24种不同旋转一一计算出循环个数就可以.和 U ...
- ROS中利用V-rep进行地图构建仿真
V-rep中显示激光扫描点 在VREP自带的场景中找到practicalPathPlanningDemo.ttt文件,删除场景中多余的物体只保留静态的地图.然后在Model browser→comp ...
- springMVC自定义方法属性解析器
使用场景例子: 用户登陆系统一般会往Session里放置一个VO对象,然后在controller里会来获取用户的userId等信息. 之前的写法是:@SessionAttributes配合@Model ...
- Python-Flask实现电影系统管理后台
代码地址如下:http://www.demodashi.com/demo/14850.html 项目描述 该项目实现电影系统的后台接口,包括用户,电影,场次,订单,评论,优惠券,推荐,收藏等多个模块, ...