同步队列-Queue模块解析

        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.  1 def worker():
     2     while True:
     3         item = q.get()
     4         do_work(item)
     5         q.task_done()
     6 
     7 q = Queue()
     8 for i in range(num_worker_threads):
     9      t = Thread(target=worker)
    10      t.daemon = True
    11      t.start()
    12 
    13 for item in source():
    14     q.put(item)
    15 
    16 q.join()       # block until all tasks are done
原文地址:https://www.cnblogs.com/fireflow/p/4869551.html