一、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()
网友评论