Queue LifoQueue and PriorityQueue
来源:互联网 发布:证件照合成软件 编辑:程序博客网 时间:2024/05/21 19:32
queue模块实现了多生产者,多消费者队列。在多线程环境下,该队列能实现多个线程间安全的信息交换。
queue模块介绍
模块实现了3种类型的队列,区别在于队列中条目检索的顺序不同。在FIFO队列中,按照先进先出的顺序检索条目。在LIFO队列中,最后添加的条目最先检索到(操作类似一个栈)。在优先级队列中,条目被保存为有序的(使用heapq模块)并且最小值的条目被最先检索。
queue模块定义了下面的类和异常:
queue模块定义了下面的类和异常:
class queue.Queue(maxsize=0)
FIFO队列的构造器。maxsize为一个整数,表示队列的最大条目数。一旦队列满,插入将被阻塞直到队列中存在空闲空间。如果maxsize小于等于0,队列大小为无限。
class queue.LifoQueue(maxsize=0)
LIFO队列的构造器。maxsize是一个整数,表示队列的最大条目数。一旦队列满,插入将被阻塞直到队列中存在空闲空间。如果maxsize小于等于0,队列大小为无限。
class queue.PriorityQueue(maxsize=0)
优先级队列的构造器。maxsize是一个整数,表示队列的最大条目数。一旦队列满,插入将被阻塞直到队列中存在空闲空间。如果maxsize小于等于0,队列大小为无限。
最小值的条目被最先检索到(最小值的条目即为被sorted(list(entries))[0]返回的条目)。通常一个条目被保存为下面的形式:(priority_number, data)。
最小值的条目被最先检索到(最小值的条目即为被sorted(list(entries))[0]返回的条目)。通常一个条目被保存为下面的形式:(priority_number, data)。
exception queue.Empty
当Queue为空时,非阻塞的get()或者get_nowait()被调用时,将抛出该异常。
exception queue.Full
当队列满时,非阻塞的put()或者put_nowait()被调用,将抛出该异常。
Queue对象
Queue对象(Queue、LifoQueue或者PriorityQueue)提供了以下方法:
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()
阻塞直到队列中所有条目都被获取并处理。
当一个条目被增加到队列时,未完成任务的计数将增加。当一个消费者线程调用task_done()时,未完成任务的计数将减少。当未完成任务的计数减少到0时,join()解锁。
下面是一个具体的例子,用于说明怎么等待队列任务完成:
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()
阻塞直到队列中所有条目都被获取并处理。
当一个条目被增加到队列时,未完成任务的计数将增加。当一个消费者线程调用task_done()时,未完成任务的计数将减少。当未完成任务的计数减少到0时,join()解锁。
下面是一个具体的例子,用于说明怎么等待队列任务完成:
- def worker():
- while True:
- item = q.get()
- do_work(item)
- q.task_done()
- q = Queue()
- for i in range(num_worker_threads):
- t = Thread(target=worker)
- t.daemon = True
- t.start()
- for item in source():
- q.put(item)
- q.join() # 阻塞直到所有任务完成
0 0
- Queue LifoQueue and PriorityQueue
- python模块学习(queue模块的Queue类、PriorityQueue类和LifoQueue类)
- Queue+PriorityQueue
- MinHeap MaxHeap using Queue (PriorityQueue)
- [疯狂Java]集合:Queue、PriorityQueue
- JAVA中的Queue与PriorityQueue
- Java Queue系列之PriorityQueue
- PriorityQueue and Heap
- Stack,Queue,PriorityQueue;栈,队列,优先队列
- 普通Queue与PriorityQueue的区别
- ArrayList,LinkedList,Stack,Queue,PriorityQueue 基本概念
- Queue集合中的PriorityQueue实现类
- Java HashMap And PriorityQueue Use
- PriorityQueue
- PriorityQueue
- priorityqueue
- PriorityQueue
- PriorityQueue
- CodeForces651AJoysticks
- 在jsp中获取已选中checkbox其他列的值
- Java之调用被子类重载的方法
- c# 继承 virtual override new
- Android studio 挂断电话 使用ITelephony.aidl
- Queue LifoQueue and PriorityQueue
- codeforces 676C (尺取法)
- nyoj 762第k个互质数 poj 2773Happy 2006
- Verilog基础知识2(FPGA小数运算处理--定点小数)
- java并发编程实践(2)线程安全性
- 数据结构与算法的分析 —— 渐进复杂度(三个记号)
- 解决方法:android 6.0(api 23) SDK,不再提供org.apache.http.*(只保留几个类)
- 侧滑
- 2015 湘潭大学程序设计比赛(Internet)部分题解,其中有一个题与NYOJ1057很像,贪心过~~