Queue模块实现了多生产者、多消费者队列。当必须在多个线程之间安全地交换信息时,它在线程编程中特别有用,实现了所有必需的锁定语义。

一、该模块实现了三种类型的队列,它们的区别仅在于检索条目的顺序:

    1、FIFO 队列,其添加的第一个任务是第一个检索的任务。

    2、LIFO 队列,其最近添加的条目是第一个检索的(像堆栈一样运行)。

    3、Priority 队列,其条目将保持排序,并首先检索最低值的条目。

二、该模块定义了以下类和异常:

  class  Queue.Queuemaxsize = 0 

  FIFO队列的构造函数。 maxsize是一个整数,用于设置可以放入队列的项目数的上限。达到此大小后,插入将阻止,直到消耗队列项。如果 maxsize小于或等于零,则队列大小为无限大。

  class  Queue.LifoQueuemaxsize = 0 

  LIFO队列的构造函数。 maxsize是一个整数,用于设置可以放入队列的项目数的上限。达到此大小后,插入将阻止,直到消耗队列项。如果 maxsize小于或等于零,则队列大小为无限大。

  class  Queue.PriorityQueuemaxsize = 0 

  Priority队列的构造函数。 maxsize是一个整数,用于设置可以放入队列的项目数的上限。达到此大小后,插入将阻止,直到消耗队列项。如果 maxsize小于或等于零,则队列大小为无限大。

  exception  Queue.Empty

  在queue对象为空时调用非阻塞 get()或 get_nowait()时引发异常。

  exception Queue.Full

  在queue对象已满时调用非阻塞 put()或 put_nowait()时引发异常。

 

三、queue对象提供下面描述的公共方法:

  Queue.qsize()    

    返回队列的大致大小(非准确值)。    

  Queue.empty()    

    如果队列为空则返回True,否则返回False(仅限当前,不保证后续情况)。    

  Queue.full()    

    如果队列已满则返回True,否则返回False(仅限当前,不保证后续情况)。

  Queue.put(item [,block [,timeout ] ] )

    将item放入队列。如果可选参数block为true 且 timeout为None,则在必要时阻止,直到有空闲槽可用。如果 timeout是一个正数,它会阻止最大超时时间,如果在该时间内没有可用的空闲槽,则会引发Full异常。

    反之(block为false),如果有空闲槽可以立即使用,则将item放入队列,否则引发Full异常(在这种情况下忽略超时)。

  Queue.put_nowait(item) 

    相当于 put(item, False)。

  Queue.get([ block [,timeout ] ] ) 

    从队列中删除并返回一个item。 如果可选的args块为true且timeout为None(默认值),则在必要时阻止,直到某个项可用为止。 如果timeout是一个正数,它会阻止最多超时秒,如果在该时间内没有可用的项,则会引发Empty异常。

    反之(block为false),如果有item可以立即使用,则返回该tem,否则引发Empty异常(在这种情况下忽略超时)。

  Queue.get_nowait()

  相当于 get(False)。

四、queue对象还提供了两种方法来支持跟踪守护进程、消费者线程是否已完全处理入队任务:

  Queue.task_done()

表示之前队列的任务已完成。由队列消费者线程使用。对于用于获取任务的每个get(),对task_done()的后续调用会告知队列该任务的处理已完成。

如果join() 当前正阻塞,则它将在所有条目都已处理后恢复(这意味着已为每个已放入队列的条目收到task_done()调用)。

如果调用的次数超过队列中放置的条目,则引发ValueError。

  Queue.join()

阻止直到队列中的所有条目都已获取并处理完毕。

每当条目添加到队列时,未完成任务的计数就会增加。每当消费者线程调用task_done()以指示该条目已被检索并且其上的所有工作都已完成时,计数就会下降。当未完成任务的数量降至零时,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() # block until all tasks are done

Python Queue(队列)的更多相关文章

  1. Python -- queue队列模块

    一 简单使用 --内置模块哦 import Queuemyqueue = Queue.Queue(maxsize = 10) Queue.Queue类即是一个队列的同步实现.队列长度可为无限或者有限. ...

  2. Python之路-python(Queue队列、进程、Gevent协程、Select\Poll\Epoll异步IO与事件驱动)

    一.进程: 1.语法 2.进程间通讯 3.进程池 二.Gevent协程 三.Select\Poll\Epoll异步IO与事件驱动 一.进程: 1.语法 简单的启动线程语法 def run(name): ...

  3. Python Queue队列

    queue is especially useful in threaded programming when information must be exchanged safely between ...

  4. 简短而有效的python queue队列解释

    Queue.qsize() 返回队列的大小  Queue.empty() 如果队列为空,返回True,反之False  Queue.full() 如果队列满了,返回True,反之False Queue ...

  5. Python 用队列实现多线程并发

    # Python queue队列,实现并发,在网站多线程推荐最后也一个例子,比这货简单,但是不够规范 # encoding: utf-8 __author__ = 'yeayee.com' # 由本站 ...

  6. Python自动化运维之16、线程、进程、协程、queue队列

    一.线程 1.什么是线程 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位. 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行 ...

  7. Python第十五天 datetime模块 time模块 thread模块 threading模块 Queue队列模块 multiprocessing模块 paramiko模块 fabric模块

    Python第十五天  datetime模块 time模块   thread模块  threading模块  Queue队列模块  multiprocessing模块  paramiko模块  fab ...

  8. Python之队列Queue

    今天我们来了解一下python的队列(Queue) queue is especiall useful in threaded programming when information must be ...

  9. python threading模块使用 以及python多线程操作的实践(使用Queue队列模块)

    今天花了近乎一天的时间研究python关于多线程的问题,查看了大量源码 自己也实践了一个生产消费者模型,所以把一天的收获总结一下. 由于GIL(Global Interpreter Lock)锁的关系 ...

随机推荐

  1. MySQL delete语句的问题

    以前遇到过几次这个问题,都觉得问题不大,所以没有记录,但是这次又遇到了,而且没有第一时间想起来,所以还是有记录下的必要 MySQL    delete语句使用子查询操作同一张表的时候会抛出 DELET ...

  2. Python学习笔记–Chapter 2

    1.字符串中添加制表符,可使用字符组合\t 2.字符串中添加换行符,可使用字符组合\n 3.字符串\n\t可以换到下一行,并且在开头添加一个制表符. 4.删除末尾空白,使用方法rstrip() 5.删 ...

  3. 前端自定义format函数,做字符串格式化功能

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 随笔:关于Class.getSimpleName()

    最近学习过程中,遇到了Class.getSimpleName()这个方法,就搜索了一些资料: API定义: Class.getName():以String的形式,返回Class对象的"实体& ...

  5. Exp6 信息搜集与漏洞扫描

     Exp6 信息搜集与漏洞扫描 1.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 2.实践内容 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现. ...

  6. jquery考试成绩统计系统

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. [R] 繪圖 Par 函数

    本篇內文主引用 https://zhuanlan.zhihu.com/p/21394945 之內容再稍加整理並參照下方有用資源 [rdocumentation] https://www.rdocume ...

  8. ORA-00257: archiver error. Connect internal only, until freed……

    今天给客户测 试问题,让客户把数据发过来了.解压缩后一看,他们还是用的oracle 815版本的(他们exp导出时,带了导出日志,从导出日志中看出来是oracle 815版本的),不过没有关系,低版本 ...

  9. VLC播放器

    为了将多个视频放在一个窗口,最开始想用的是windows media player ,6个视频,把整个电脑卡得不动了(显卡太弱,是多输出口的,没法换),于是又想把视频压缩成一个,网上的大部分软件要收费 ...

  10. Hbase各版本环境要求

    1.HBase各版本JDK支持情况           HBase Version JDK 7 JDK 8 JDK 9 JDK 10 2.0 Not Supported yes Not Support ...