Queue模块解决了生产者、消费者问题,在多线程编程中进行线程通信的时候尤其有用,Queue类封装了加锁解锁的过程。

        在Queue模块中有三种不同的队列类,区别是不同队列取出数据的顺序不同。在FIFO队列中,先存进去的数据最先取出来。而在LIFO队列中,最后存进去的数据最取出来。在加权队列中,权值最小的先取出来。
        Queue(maxsize=0)类
        构造一个先进先出FIFO的队列,maxsize是个整数,指定了队列中最多能够存入的数据个数,如果达到最大数目,将不能再进行插入操作,如果maxsize小于等于0,则对插入的数目没有限制。
        LifeQueue(maxsize)类
        构造一个后进先出LIFO的队列。其他跟Queue类一样。
        PriorityQueue(maxsize)类
        加权队列,权值最小的值最先取出。插入的数据格式应该为(priority_number, data)
        此外,Queue模块还定义了两个异常类。
        Empty
        当队列为空却执行get()操作时,将抛出这个异常。
        Full
        当队列满了,却执行put()操作时将抛出这个异常。
        注意:collections模块中的deque是不带加锁解锁功能的。

Queue对象

Queue对象定义了以下公共方法。

qsize():返回队列的大小。

empty():判断队列是否为空。

  full():判断队列是否满了。

  put(item[,block[,timeout]]):插入元素到队列,如果可选参数block为True,并且timeout为None(默认值),将等待队列中有空闲位置,如果timetout为一个正整数,将最多等待timeout秒,然后抛出Full异常。如果Block为False,在队列中有空余位置时直接执行插入操作,如果没有则抛出异常。

put_nowait(item):相当于put(item,False)

get([block[,timeout]]):从队列中取出一个元素,如果可选参数block为True,并起timeout为None,如果队列为空将等待直到队列中不为空,如果timeout为一个正整数,则只会等待最多timeout秒,然后抛出Empty异常。如果block为False,如果队列非空将直接返回元素,如果为空则抛出异常。

  get_nowait():相当于get(False)

  join():等待队列中所有的元素被取出并执行。

task_done():当前一个从队列中取出的任务执行完毕之后,通过这个方法告诉队列操作已经执行完毕。

例如下面的例子:

  1.  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

同步队列-Queue模块解析的更多相关文章

  1. Python 单向队列Queue模块详解

    Python 单向队列Queue模块详解 单向队列Queue,先进先出 '''A multi-producer, multi-consumer queue.''' try: import thread ...

  2. Python之队列queue模块使用 常见问题与用法

    python 中,队列是线程间最常用的交换数据的形式.queue模块是提供队列操作的模块,虽然简单易用,但是不小心的话,还是会出现一些意外. 1. 阻塞模式 import queue q = queu ...

  3. Python队列queue模块

    Python中queue模块常用来处理队列相关问题 队列常用于生产者消费者模型,主要功能为提高效率和程序解耦 1. queue模块的基本使用和相关说明 # -*- coding:utf-8 -*- # ...

  4. Python 双向队列Deque、单向队列Queue 模块使用详解

    Python 双向队列Deque 模块使用详解 创建双向队列Deque序列 双向队列Deque提供了类似list的操作方法: #!/usr/bin/python3 import collections ...

  5. python多线程以及同步队列(转)

    转自:http://www.w3cschool.cc/python/python-multithreading.html 多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长 ...

  6. Python进阶【第二篇】多线程、消息队列queue

    1.Python多线程.多进程 目的提高并发 1.一个应用程序,可以有多进程和多线程 2.默认:单进程,单线程 3.单进程,多线程 IO操作,不占用CPU python的多线程:IO操作,多线程提供并 ...

  7. Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就绪,挂起,运行) ,***协程概念,yield模拟并发(有缺陷),Greenlet模块(手动切换),Gevent(协程并发)

    Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就 ...

  8. python笔记9 线程进程 threading多线程模块 GIL锁 multiprocessing多进程模块 同步锁Lock 队列queue IO模型

    线程与进程 进程 进程就是一个程序在一个数据集上的一次动态执行过程.进程一般由程序.数据集.进程控制块三部分组成.我们编写的程序用来描述进程要完成哪些功能以及如何完成:数据集则是程序在执行过程中所需要 ...

  9. threading模块和queue模块实现程序并发功能和消息队列

    简介: 通过三个例子熟悉一下python threading模块和queue模块实现程序并发功能和消息队列. 说明:以下实验基于python2.6 基本概念 什么是进程? 拥有独立的地址空间,内存,数 ...

随机推荐

  1. Jackson 框架,轻易转换JSON【转】

    Jackson 框架,轻易转换JSON Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json.xml转换成Java对象. 前面有介绍过json-lib这个框架,在 ...

  2. 使用Vitamio打造自己的Android万能播放器(6)——在线播放(播放列表)

    前言 新版本的VPlayer由设计转入开发阶段,预计开发周期为一个月,这也意味着新版本的Vitamio将随之发布,开发者们可以和本系列文章一样,先开发其他功能.本章内容为"在线视频播放列表& ...

  3. Sizzle一步步实现所有功能(一)

    前提: 1.HTML5自带querySelectAll可以完全替代Sizlle,所以我们下面写的Sizzle,是不考虑QSA的. 2.作者考虑了大量兼容情况,比如黑莓4.6系统这样几乎接触不到的bug ...

  4. Android常见布局问题

    原文链接:http://www.cnblogs.com/Birdmafly/p/3809802.html 好久没写博了,因为最近在忙着做一个app,实在是没有时间.现在快完工了.想着还是把这个布局问题 ...

  5. 如何用SQL操作数据------告别标题党

    额,首先跟大家道一个歉,由于本人上次利用标题来骗访问,对各位大哥大姐,叔叔阿姨,弟弟妹妹,and舅子老表的时间及流量造成了严重的浪费,本人深表歉意(好吧,其实本人内心还是有那么一丢丢的自豪的,毕竟是一 ...

  6. 关于sizeof()和内存对齐

    PS补充:枚举类型的字节数为什么为4 百度知道回答: typedef enum e1{ MON, TUE, THI, }e; e1是一个数值,它的允许值范围是: MON,TUE,THI, 它的取值为其 ...

  7. Windows 去掉启动时的放大镜

    控制面板-轻松访问中心-使计算机更易于显示不勾选 启用放大镜

  8. 获取checkbox 的选中状态的id、checkbox的一些操作

    var id_array=new Array(); $('input[name="id"]:checked').each(function(){ id_array.push($(t ...

  9. Scala写排序可以说是简洁又明了

    例如归并排序,清晰明了. object MergeSort extends App {     val oldList = List[Int](12, 40, 26, 89, 75, 44, 32,  ...

  10. C++静态库与动态库(简介)

    C++静态库与动态库 这次分享的宗旨是——让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学,推荐一 ...