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] 展示了一个增 ...
随机推荐
- 神器phpstorm功能具体解释
phpstorm包括了webstorm的所有功能,更可以支持php代码. PhpStorm是一个轻量级且便捷的PHP IDE,其旨在提供用户效率,可深刻理解用户的编码,提供智能代码补全,高速导航以及即 ...
- Pig jline.Terminal错误
运行Pig时出现这个错误: [main] ERROR org.apache.pig.Main - ERROR 2998: Unhandled internal error. Found interfa ...
- Android ART runtime简述
此文章原始是PPT格式已转换为PDF,完整内容也能够下载文档阅读: AndroidARTruntimeOverview watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5 ...
- 转 VB ListView控件各种操作详解
Private Sub Form_Load() ListView1.ListItems.Clear '清空列表 ListView1.ColumnHeaders.Clear '清空列表头 ListVie ...
- 官方sakila测试库
官方sakila测试库 http://downloads.mysql.com/docs/sakila-db.zip
- Jquery为动态添加的未来元素绑定事件
语法: $(selector).on(event,childSelector,data,function) event:必需.规定要从被选元素移除的一个或多个事件或命名空间.由空格分隔多个事件值,也可 ...
- col-xs , col-sm , col-md , col-lg是什么意思?什么时候用?
.col-xs- 超小屏幕 手机 (<768px) .col-sm- 小屏幕 平板 (≥768px) .col-md- 中等屏幕 桌面显示器 (≥992px) .col-lg- 大屏幕 大桌面显 ...
- 【Linux】函数与参数
函数的定义 函数的定义包括function命令.函数名.开/闭括号包括以及包含在一对花括号中的函数体. (1) 函数定义 function fname() { Statements; } 或者 fna ...
- Ubuntu x86-64汇编(4) 数值操作指令
整数乘法指令 Integer Multiplication 对于有符号数的乘法有特殊的规则, 因此无符号数乘法和有符号数乘法对应着不同的指令mul和imul. 乘法会产生两倍尺寸的数值结果, 即两个n ...
- Raspberry pi 使用python+pySerial实现串口通信(转)
Raspberry pi 使用python+pySerial实现串口通信 转:http://blog.csdn.net/homeway999/article/details/8642353 目录( ...