queue队列

class queue.Queue(maxsize=0) #先入先出

class queue.LifoQueue(maxsize=0) #后入先出

class queue.PriorityQueue(maxsize=0) #存储数据时可设置优先级的队列

queue.PriorityQueue 优先级案例一(使用数值进行优先级排序,数值越小优先级越高)

import Queue

class PriorityQueue(Queue.Queue):
def _put(self, item):
data, priority = item
self._insort_right((priority, data)) def _get(self):
return self.queue.pop(0)[1] def _insort_right(self, x):
"""Insert item x in list, and keep it sorted assuming a is sorted. If x is already in list, insert it to the right of the rightmost x.
"""
a = self.queue
lo = 0
hi = len(a) while lo < hi:
mid = (lo+hi)/2
if x[0] < a[mid][0]: hi = mid
else: lo = mid+1
a.insert(lo, x) def test():
pq = PriorityQueue() pq.put(('b', 1))
pq.put(('a', 1))
pq.put(('c', 1))
pq.put(('z', 0))
pq.put(('d', 2)) while not pq.empty():
print pq.get(), test()

重写PriorityQueue类

执行结果

d

c

a

b

z

使用heapq实现优先级队列

# coding=utf-8
from heapq import heappush, heappop class PriorityQueue:
def __init__(self):
self._queue = [] def put(self, item, priority):
heappush(self._queue, (-priority, item))
print(self._queue) def get(self):
# print(heappop(self._queue),"---")
return heappop(self._queue)[-1] #返回堆里面最小的值 q = PriorityQueue()
q.put('world', 1)
q.put('hello', 2)
print(q.get())
print(q.get())

结果

[(-1, 'world')]

[(-2, 'hello'), (-1, 'world')]

hello

world

queue的用法

Queue.qsize()

返回队列的近似大小。注意,qsize() > 0并不能保证接下来的get()方法不被阻塞;同样,qsize() < maxsize也不能保证put()将不被阻塞。

Queue.empty()

如果队列是空的,则返回True,否则False。如果empty()返回True,并不能保证接下来的put()调用将不被阻塞。类似的,empty()返回False也不能保证接下来的get()调用将不被阻塞。

Queue.full()

如果队列满则返回True,否则返回False。如果full()返回True,并不能保证接下来的get()调用将不被阻塞。类似的,full()返回False也不能保证接下来的put()调用将不被阻塞。

Queue.put(item, block=True, timeout=None)

放item到队列中。如果block是True,且timeout是None,该方法将一直等待直到有队列有空余空间。如果timeout是一个正整数,该方法则最多阻塞timeout秒并抛出Full异常。如果block是False并且队列满,则直接抛出Full异常(这时timeout将被忽略)。

Queue.put_nowait(item)

等价于put(item, False)。

Queue.get(block=True, timeout=None)

从队列中移除被返回一个条目。如果block是True并且timeout是None,该方法将阻塞直到队列中有条目可用。如果timeout是正整数,该方法将最多阻塞timeout秒并抛出Empty异常。如果block是False并且队列为空,则直接抛出Empty异常(这时timeout将被忽略)。

Queue.get_nowait()

等价于get(False)。

如果需要跟踪进入队列中的任务是否已经被精灵消费者线程处理完成,可以使用下面提供的两个方法:

Queue.task_done()

表示一个先前的队列中的任务完成了。被队列消费者线程使用。对于每个get()获取到的任务,接下来的task_done()的调用告诉队列该任务的处理已经完成。

如果join()调用正在阻塞,当队列中所有的条目被处理后它将恢复执行(意味着task_done()调用将被放入队列中的每个条目接收到)。

如果调用次数超过了队列中放置的条目数目,将抛出ValueError异常。

Queue.join()

阻塞直到队列中所有条目都被获取并处理。

Python自动化之线程进阶篇(二)的更多相关文章

  1. Python自动化之线程进阶篇

    拓展知识 什么是CPU-bound(计算密集型) 和I/O bound(I/O密集型) ? I/O bound 指的是系统的CPU效能相对硬盘/内存的效能要好很多,此时,系统运作,大部分的状况是 CP ...

  2. python自动化之models 进阶操作二

    ################################################################## # PUBLIC METHODS THAT ALTER ATTRI ...

  3. WPF 4 DataGrid 控件(进阶篇二)

    原文:WPF 4 DataGrid 控件(进阶篇二)      上一篇<WPF 4 DataGrid 控件(进阶篇一)>中我们通过DataGridTemplateColumn 类自定义编辑 ...

  4. Python基础—面向对象(进阶篇)

    通过上一篇博客我们已经对面向对象有所了解,下面我们先回顾一下上篇文章介绍的内容: 上篇博客地址:http://www.cnblogs.com/phennry/p/5606718.html 面向对象是一 ...

  5. python笔记13-多线程实战篇(tomorrow)

    安装 1.tomorrow安装,用pip可以直接安装 pip install tomorrow 单线程 1.以下案例是单线程时候跑的情况,在下载图片的时候很耗时. # coding:utf-8 fro ...

  6. python学习笔记——线程threading (二)重写run()方法和守护进程daemon()

    1 run()方法 1.1 单个线程 在threading.Thread()类中有run()方法. from time import ctime,sleep import threading # 定义 ...

  7. Python自动化 【第十篇】:Python进阶-多进程/协程/事件驱动与Select\Poll\Epoll异步IO

    本节内容: 多进程 协程 事件驱动与Select\Poll\Epoll异步IO   1.  多进程 启动多个进程 进程中启进程 父进程与子进程 进程间通信 不同进程间内存是不共享的,要想实现两个进程间 ...

  8. Python自动化 【第八篇】:Python基础-Socket编程进阶

    本节内容: Socket语法及相关 SocketServer实现多并发 1. Socket语法及相关 sk = socket.socket(socket.AF_INET,socket.SOCK_STR ...

  9. Python自动化 【第十一篇】:Python进阶-RabbitMQ队列/Memcached/Redis

     本节内容: RabbitMQ队列 Memcached Redis 1.  RabbitMQ 安装 http://www.rabbitmq.com/install-standalone-mac.htm ...

随机推荐

  1. <摘录>如何在64位linux强制编译32位应用程序

    GDC注:因为需要解决在linux64机上编译32位的mongodb(没办法,因为编译的php是32位,然后我想将mongdb扩展添加到php中),在网上搜了很多文章,感觉这篇好懂,而且好用.我使用的 ...

  2. JavaScript学习笔记——DOM_document对象

    javascript-document对象详解 DOM document(html xml) object modledocument对象(DOM核心对象) 作用: 1.内容 innerHTML 2. ...

  3. Java学习笔记2

    package welcome; public class Constants { public static void main(String[] args){ final double CM_PE ...

  4. LyX-220-Installer-3

    所见即所得 单独安装这个写作业可以了,要发论文用CTeX Ctrl + M 打开数学输入,里面可以输入 TeX 代码

  5. 国内GIT托管服务

    http://www.cnblogs.com/TianFang/p/3348949.html

  6. C#和SQL实现的字符串相似度计算代码分享

    http://www.jb51.net/article/55941.htm C#实现: 复制代码 代码如下: #region 计算字符串相似度        /// <summary>   ...

  7. localdb下载地址

    https://www.microsoft.com/zh-cn/download/confirmation.aspx?id=29062 只能使用IE下载 http://www.microsoft.co ...

  8. Python 线程、进程和协程

    python提供了两个模块来实现多线程thread 和threading ,thread 有一些缺点,在threading 得到了弥补,为了不浪费时间,所以我们直接学习threading 就可以了. ...

  9. 我的linux桌面

    经过几次尝试安装linux系统之后,终于把自己的系统安装成了linux系统. wangkongming@ThinkPad-T410 ~ $ lsb_release -a No LSB modules ...

  10. NetBeans如何关联两个项目

    在实际工作中,有的项目需要关联其他项目 找到项目-->右键-->属性-->包含路径-->添加文件夹 添加你要的项目即可.