博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python标准库介绍——32 Queue 模块详解
阅读量:6307 次
发布时间:2019-06-22

本文共 3448 字,大约阅读时间需要 11 分钟。

Queue 模块``Queue`` 模块提供了一个线程安全的队列 (queue) 实现, 如 [Example 3-2 #eg-3-2] 所示. 你可以通过它在多个线程里安全访问同个对象.====Example 3-2. 使用 Queue 模块====[eg-3-2]```File: queue-example-1.pyimport threadingimport Queueimport time, randomWORKERS = 2class 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 itqueue = Queue.Queue(0)for i in range(WORKERS):    Worker(queue).start() # start a workerfor i in range(10):    queue.put(i)for i in range(WORKERS):    queue.put(None) # add end-of-queue markers*B*task 1 finishedtask 0 finishedtask 3 finishedtask 2 finishedtask 4 finishedtask 5 finishedtask 7 finishedtask 6 finishedtask 9 finishedtask 8 finished*b*```[Example 3-3 #eg-3-3] 展示了如何限制队列的大小. 如果队列满了, 那么控制主线程 (producer threads) 被阻塞, 等待项目被弹出 (pop off). ====Example 3-3. 使用限制大小的 Queue 模块====[eg-3-3]```File: queue-example-2.pyimport threadingimport Queueimport time, randomWORKERS = 2class 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 queuequeue = Queue.Queue(3)for i in range(WORKERS):    Worker(queue).start() # start a workerfor 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 0push 1push 2push 3push 4push 5task 0 finishedpush 6task 1 finishedpush 7task 2 finishedpush 8task 3 finishedpush 9task 4 finishedtask 6 finishedtask 5 finishedtask 7 finishedtask 9 finishedtask 8 finished*b*```你可以通过继承 //Queue// 类来修改它的行为. [Example 3-4 #eg-3-4] 为我们展示了一个简单的具有优先级的队列. 它接受一个元组作为参数, 元组的第一个成员表示优先级(数值越小优先级越高). ====Example 3-4. 使用 Queue 模块实现优先级队列====[eg-3-4]```File: queue-example-3.pyimport Queueimport bisectEmpty = Queue.Emptyclass PriorityQueue(Queue.Queue):    "Thread-safe priority queue"    def _put(self, item):        # insert in order        bisect.insort(self.queue, item)## try itqueue = PriorityQueue(0)# add items out of orderqueue.put((20, "second"))queue.put((10, "first"))queue.put((30, "third"))# print queue contentstry:    while 1:        print queue.get_nowait()except Empty:    pass*B*thirdsecondfirst*b*```[Example 3-5 #eg-3-5] 展示了一个简单的堆栈 (stack) 实现 (末尾添加, 头部弹出, 而非头部添加, 头部弹出).====Example 3-5. 使用 Queue 模块实现一个堆栈====[eg-3-5]```File: queue-example-4.pyimport QueueEmpty = Queue.Emptyclass 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 itstack = Stack(0)# push items on stackstack.push("first")stack.push("second")stack.push("third")# print stack contentstry:    while 1:        print stack.pop_nowait()except Empty:    pass*B*thirdsecondfirst*b*```

 

转载地址:http://rgnxa.baihongyu.com/

你可能感兴趣的文章
Do While ... Loop 与 Do Until ... Loop 的区别
查看>>
【Linux】查询某个字符串出现次数
查看>>
高效使用jquery之一:请使用'On'函数
查看>>
冲刺第一周第三天
查看>>
ERP环境检测工具设计与实现 Environment Detection
查看>>
不要在构造中做太多事情,不然有时候会出现有意思的代码~
查看>>
IIS 发布网站遇到的问题
查看>>
NuGet学习笔记(2)——使用图形化界面打包自己的类库
查看>>
xcode中没有autoSizing的设置
查看>>
字符编码
查看>>
企业应用:应用层查询接口设计
查看>>
浅谈Excel开发:十 Excel 开发中与线程相关的若干问题
查看>>
nfd指令的详细说明
查看>>
安装VisualSvn Server时遇到的问题
查看>>
不用Visual Studio,5分钟轻松实现一张报表
查看>>
人脸识别 开放书籍 下载地址
查看>>
Notepad++配置Python开发环境
查看>>
用户组概念 和 挂载 概念
查看>>
如何快速获取ADO连接字符串
查看>>
AspNetPager控件的最基本用法
查看>>