Python Queue模块

Oct 8, 2015


Queue类 是一个队列的同步实现, 队列长度可为无限或者有限,下面就mark一下具体的使用方法


三种队列

  • queue模块有三种队列

    • python queue模块的FIFO队列先进先出。Queue.Queue(maxsize)

    • LIFO类似于堆。即先进后出。Queue.LifoQueue(maxsize)

    • 还有一种是优先级队列级别越低越先出来。Queue.PriorityQueue(maxsize)


队列存取

  • q.put(10): 调用队列对象的put()方法在队尾插入一个项目。put()有两个参数,第一个item为必需的,为插入项目的值;第二个block为可选参数,默认为 1。如果队列当前为满且block为1,put()方法就使调用线程暂停,直到空出一个数据单元。如果block为0,put方法将引发Full异常

  • q.get(): 调用队列对象的get()方法从队头删除并返回一个项目。可选参数为block,默认为True。如果队列为空且block为True,get()就使调用线程暂停,直至有项目可用。 如果队列为空且block为False,队列将引发Empty异常


其他方法

  • Queue.qsize() : 返回队列的大小

  • Queue.empty() : 如果队列为空,返回True,反之False

  • Queue.full() : 如果队列满了,返回True,反之False

  • Queue.get_nowait() : 相当Queue.get(False)

  • Queue.put_nowait(item) : 相当Queue.put(item, False)

  • Queue.task_done() : 在完成一项工作之后,Queue.task_done() 函数向任务已经完成的队列发送一个信号Queue.join() 实际上意味着等到队列为空,再执行别的操作.

  • 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()