Queue模块

2017-03-29  本文已影响80人  037251a7c483

一、class Queue.Queue 类

Queue类表示使用FIFO队列

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

    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()
上一篇 下一篇

猜你喜欢

热点阅读