美文网首页
Queue模块

Queue模块

作者: 037251a7c483 | 来源:发表于2017-03-29 23:54 被阅读80次

一、class Queue.Queue 类

Queue类表示使用FIFO队列

  • Queue.qsize()
      返回队列的大致大小。注意,qsize()>0不保证后面的get()不会阻塞,qsize()<maxsize也不会保证put()不会阻塞。

  • Queue.empty()
      如果队列为空,返回True,否则返回False。如果empty()返回True,它不保证后续调用put()不会阻塞。 同样,如果empty()返回False,它不保证随后调用get()不会阻塞。

  • Queue.full()
      如果队列已满,返回True,否则返回False。

  • Queue.put(item, [block[,timeout]])
      将项目放入队列。 如果可选的args块为true并且超时为None(默认值),则在必要时阻塞,直到空闲插槽可用。 如果timeout是一个正数,它会阻塞最多超时秒数,并且如果在该时间内没有可用空闲时间,则会引发完全异常。 否则(block is Flase),如果空闲时隙立即可用,则将一个项目放在队列上,否则提高完全异常(在这种情况下忽略超时)。

  • Queue.put_nowait(item)

  • Queue.get([block[, timeout]])
      从队列中取得任务

  • Queue.get_nowait(item)

  • Queue.task_done()
      表明原来的入队的任务已经完成。该方法为队列消费者线程使用,get()用于取得一个task,随后调用task_done()告诉队列处理的任务已经完成
      如果当前join()正在阻塞,当所有的任务完成时,它将恢复——相当于已经被put()到队列中的每个项目都收到了一个task_done()调用,从而表示所有任务完成了。下面是源码:

    def task_done(self):
        self.all_tasks_done.acquire()
        try:
            unfinished = self.unfinished_tasks - 1
            if unfinished <= 0:
                if unfinished < 0:
                    raise ValueError('task_done() called too many times')
                self.all_tasks_done.notify_all()
            self.unfinished_tasks = unfinished
        finally:
            self.all_tasks_done.release()
  • Queue.join()
      阻塞,直到队列中的所有项目都被获取和处理。每当项目添加到队列中时,未完成任务的计数就上升。 当消费者线程调用task_done()则表示当前任务一完成,因此计数将减少。 当未完成任务的计数下降到零时,join()取消阻塞。下面是源码:

    def join(self):
        self.all_tasks_done.acquire()
        try:
            while self.unfinished_tasks:
                self.all_tasks_done.wait()
        finally:
            self.all_tasks_done.release()

二、线程+Queue构造线程池

线程池的作用是预先创建线程,然后将线程复用。这样做的好处是降低了线程创建和销毁的开销。一个任务开一个线程是十分不明智的行为。下面是threading结合Queue模块构建线程池并复用线程的例子

#!/usr/bin/python
#coding:utf-8

import threading
import Queue
import time
import random

queue = Queue.Queue()

class Worker(threading.Thread):
    def __init__(self, queue):
        super(Worker, self).__init__()
        self.queue=  queue

    def run(self):
        while 1:
            item = self.queue.get()
            print '{0} -- {1}'.format(self.name, item)
            self.queue.task_done()      #通知队列任务已经完成

def main():
    for item in range(100):
        queue.put(item)

    # 生成线程池
    for i in range(5):
        thread = Worker(queue)       #注意get()方法要放在循环中才能重复利用线程
        #thread.setDaemon(True)      #如果没有设置守护线程,则主线程永远不会退出
        thread.daemon = True
        thread.start()

    queue.join()        #任务完成后会则退出

if __name__ == "__main__":
    main()
    print threading.current_thread()

相关文章

  • python queue模块详解

    大家好,我是剑南。 本篇文章,为大家带来的是queue模块的详解! 初识queue模块 queue模块实现了多生产...

  • Python爬虫(五)--多线程续(Queue)

    本文希望达到的目标: 学习Queue模块 将Queue模块与多线程编程相结合 通过Queue和threading模...

  • Queue模块

    Queue类即是一个队列的同步实现。 队列长度可为无限或者有限。可通过Queue的构造函数的可选参数maxsize...

  • Queue模块

    一、class Queue.Queue 类 Queue类表示使用FIFO队列 Queue.qsize()返回队列的...

  • queue模块

    当今市面上有很多主流的消息中间件,如老牌的ActiveMQ、RabbitMQ、ZeroMQ,炙手可热的Kafka,...

  • 队列

    python Queue模块下队列有三种模式先入先出 queue.Queue后入先出queue.LifoQueue...

  • Python 多线程|Queue队列|生产者消费者模式|

    Queue队列 Python中,队列是线程间最常用的交换数据的形式。Queue模块是提供队列操作的模块,虽然简单易...

  • [数据结构]模块学习---queue、heapq

    1.首先了解queue模块 主要了解它的三个对象就好。 1.1 FIFO:队列queue.Queue() 1.2 ...

  • 线程优先级队列

    Queue模块可以用来进行线程间的通信,让各个线程之间共享数据Python的Queue模块提供了同步、线程安全的队...

  • 效率提升之进程同步(Queue)

    Queue:共享消息队列 Queue 模块来提供进程间通信的机制,从而让线程之间可以互相分享数据。 queue队列...

网友评论

      本文标题:Queue模块

      本文链接:https://www.haomeiwen.com/subject/qbfgnttx.html