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] 展示了一个增 ...
随机推荐
- h5画图表
折线: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&q ...
- JS 处理Json数据事例
JS从远端获取数据之后,往往还需要在处理一下,下面给出一个事例,供参考 将'[{"role_id":1,"enable":1},{"role_id&q ...
- 使用sphinx自动提取python中的注释成为接口文档
写好了代码,交付给他人使用的时候,查看代码固然可以了解各类和函数的功能细节,但接口文档能更方便的查找和说明功能.所以,一价与代码同步的接口文档是很有必要的.sphinx可以根据python中的注释,自 ...
- python enum 枚举
http://www.cnblogs.com/codingmylife/archive/2013/05/31/3110656.html python 3.4+ from enum import Enu ...
- Hadoop创建新用户
HDFS本身并没有提供用户名.组等的创建和管理,在客户端操作Hadoop时,Hadoop自动识别执行命令所在的进程的用户名和用户组,然后检查是否具有权限.启动Hadoop的用户即为超级用户,可以进行所 ...
- V-rep学习笔记:串口操作
VREP Regular API提供了串口操作的相关函数,可以对串口进行打开.关闭和读写: 下面使用一款淘宝上常见的AHRS(Attitude and heading reference system ...
- java第三节 面向对象(上)
//第三讲 //面向对象(上) /* 理解面向对象的概念 面向过程 在一个结构体中定义窗体的大小,位置,颜色,背景等属性,对窗口操作的函数窗口本身的定义没有任何关系 如HideWindow, Move ...
- 菜鸟云打印接入Demo
菜鸟云打印接入Demo 0. 接入流程图 1. 连接打印客户端 首先要打开打印客户端,然后使用下面的方法,连接客户端(WebSocket协议): 地址 : 连接打印客户端 function doCo ...
- 在quartz的Job中获得Spring的WebApplicationContext或ServletContext
有时候我们需要在web工程中定时器类里面获得spring的IOC容器,即WebApplicationContext,用它来获取实现了某接口的所有的bean,因为@Autowired貌似只能注入单个be ...
- 【转】Linux定时任务之 【crontab】
Linux定时任务Crontab命令详解 linux 系统则是由 cron (crond) 这个系统服务来控制的.Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的.另 外, ...