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 模块详解的更多相关文章

  1. python标准库介绍——27 random 模块详解

    ==random 模块== "Anyone who considers arithmetical methods of producing random digits is, of cour ...

  2. python标准库介绍——12 time 模块详解

    ==time 模块== ``time`` 模块提供了一些处理日期和一天内时间的函数. 它是建立在 C 运行时库的简单封装. 给定的日期和时间可以被表示为浮点型(从参考时间, 通常是 1970.1.1 ...

  3. python标准库介绍——10 sys 模块详解

    ==sys 模块== ``sys`` 模块提供了许多函数和变量来处理 Python 运行时环境的不同部分. === 处理命令行参数=== 在解释器启动后, ``argv`` 列表包含了传递给脚本的所有 ...

  4. python标准库介绍——30 code 模块详解

    ==code 模块== ``code`` 模块提供了一些用于模拟标准交互解释器行为的函数. ``compile_command`` 与内建 ``compile`` 函数行为相似, 但它会通过测试来保证 ...

  5. python标准库介绍——8 operator 模块详解

    ==operator 模块== ``operator`` 模块为 Python 提供了一个 "功能性" 的标准操作符接口. 当使用 ``map`` 以及 ``filter`` 一类 ...

  6. python标准库介绍——36 popen2 模块详解

    ==popen2 模块== ``popen2`` 模块允许你执行外部命令, 并通过流来分别访问它的 ``stdin`` 和 ``stdout`` ( 可能还有 ``stderr`` ). 在 pyth ...

  7. python标准库介绍——23 UserString 模块详解

    ==UserString 模块== (2.0 新增) ``UserString`` 模块包含两个类, //UserString// 和 //MutableString// . 前者是对标准字符串类型的 ...

  8. python标准库介绍——22 UserList 模块详解

    ==UserList 模块== ``UserList`` 模块包含了一个可继承的列表类 (事实上是对内建列表类型的 Python 封装). 在 [Example 2-16 #eg-2-16] 中, / ...

  9. python标准库介绍——21 UserDict 模块详解

    ==UserDict 模块== ``UserDict`` 模块包含了一个可继承的字典类 (事实上是对内建字典类型的 Python 封装). [Example 2-15 #eg-2-15] 展示了一个增 ...

随机推荐

  1. linux中fuser用法详解

    fuser功能 fuser 可以显示出当前哪个程序在使用磁盘上的某个文件.挂载点.甚至网络端口,并给出程序进程的详细信息.  fuser显示使用指定文件或者文件系统的进程ID.默认情况下每个文件名后面 ...

  2. 如何去掉browserLinkSignalR

    在使用vs开发时查看源代码可以发现最下面有以下代码,此段代码会一直请求网络,感觉不爽的可以这样去掉: <!-- Visual Studio Browser Link --> <scr ...

  3. MyBatis Spring SqlSessionFactoryBean 配置

    在基本的 MyBatis 中,session 工厂可以使用 SqlSessionFactoryBuilder 来创建.而在 MyBatis-Spring 中,则使用 SqlSessionFactory ...

  4. Ubuntu14.04设置开机自启动脚本

    方法一.编辑rc.loacl脚本  Ubuntu开机之后会执行/etc/rc.local文件中的脚本,所以我们可以直接在/etc/rc.local中添加启动脚本.在 exit 0 前面添加好脚本代码, ...

  5. 关于java线程的daemon的认识

    在 JAVA中的CountDownLatch.CyclicBarrier.Semaphore的简单测试 这文章里说到了线程的daemon问题,特写一篇来分析一下. 上代码: package com.y ...

  6. python之模块contextlib 加强with语句而存在

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python之模块contextlib,为加强with语句而存在 #特别注意:python3和python2 ...

  7. Android context空指针异常

    Fragment中的代码 context 是null public class PlaceholderFragment extends Fragment{ Context context = getA ...

  8. 【WEB2.0】 网页调用QQ聊天(PC+M站)

    很多时候,我们在网站中需要加入联系QQ的功能,我下面就来说下在web页面中调用QQ聊天是如何实现的,直接上代码: <!DOCTYPE HTML> <html> <head ...

  9. ios中第三方库归结

    1:uiscrollview 折叠 展开中不包含tablecell. 展开列表效果 Collapse Click ()  https://github.com/bennyguitar/Collapse ...

  10. [转载]RHEL-6启动时提示:“/usr/libexec/gconf-sanit

    原文地址:RHEL-6启动时提示:"/usr/libexec/gconf-sanity-check-2 exited with status 256"作者:huage 系统环境:R ...