python之Queue模块

来源:互联网 发布:四川 网络作家协会 编辑:程序博客网 时间:2024/06/05 19:28

Queue – 队列,队列是线程间最常见的交换数据的形式,Queue模块提供了队列的操作

创建一个队列对象

import Queue# 构造一个FIFO队列。maxsize是个整数,指明了队列中能存放的数据个数的上限。# 一旦达到上限,插入会导致阻塞,直到队列中的数据被消费掉。如果maxsize小于或者等于0,队列大小没有限制。workQueue = Queue.Queue(10)

Queue模块中的常用方法:

Queue.qsize() 返回队列的大小Queue.empty() 如果队列为空,返回True,反之FalseQueue.full() 如果队列满了,返回True,反之FalseQueue.full 与 maxsize 大小对应Queue.get([block[, timeout]])获取队列,timeout等待时间Queue.get_nowait() 相当Queue.get(False)Queue.put(item) 写入队列,timeout等待时间Queue.put_nowait(item) 相当Queue.put(item, False)Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号Queue.join() 实际上意味着等到队列为空,再执行别的操作

Queue模块有3种队列:
FIFO–先进先出
LiFO–先进后出
优先级别–级别越低先出
分别对应三种构造函数:

Queue.Queue(10)Queue.LifoQueue(10)Queue.PriorityQueue(10)

附上一个例子:

import Queueimport threadingimport timefrom service.TCPClient import *exitFlag = 0class myThread(threading.Thread):    def __init__(self, threadID, name, q):        threading.Thread.__init__(self)        self.threadID = threadID        self.name = name        self.q = q    def run(self):        print "Starting " + self.name        process_data(self.name, self.q)        print "Exiting " + self.namedef process_data(threadName, q):    while not exitFlag:        queueLock.acquire()        if not workQueue.empty():            data = q.get()            send_data(data)            queueLock.release()            print "%s processing %s" % (threadName, data)        else:            queueLock.release()            # time.sleep(1)threadList = ["Thread-1", "Thread-2", "Thread-3"]nameList = getData()print nameListqueueLock = threading.Lock()# 构造一个FIFO队列。maxsize是个整数,指明了队列中能存放的数据个数的上限。# 一旦达到上限,插入会导致阻塞,直到队列中的数据被消费掉。如果maxsize小于或者等于0,队列大小没有限制。workQueue = Queue.Queue(10)threads = []threadID = 1print '--start--', time.ctime()# 创建新线程for tName in threadList:    thread = myThread(threadID, tName, workQueue)    thread.start()    threads.append(thread)    threadID += 1# 填充队列queueLock.acquire()for word in nameList:    workQueue.put(word)queueLock.release()# 等待队列清空while not workQueue.empty():    pass# 通知线程是时候退出exitFlag = 1# 等待所有线程完成for t in threads:    t.join()print "Exiting Main Thread"print '--end--', time.ctime()
0 0