python实现线程池
# !/usr/bin/env python # -*- coding:utf-8 -*- import queue import threading import time class WorkManager(object): def __init__(self, work_num=1000,thread_num=10): # work_num是总的任务数,thread_num是每次同时工作的线程数量 self.work_queue = queue.Queue() # 初始化一个线程队列 self.threads = [] # 该列表存放要进行工作的线程类Work的对象,该列表的大小是根据thread_num来指定的 self.__init_work_queue(work_num) # 初始化工作队列,将所有的工作队列放进线程池 self.__init_thread_pool(thread_num) # 初始化线程池,将所有的工作线程放进线程池列表 # self.check_queue() def __init_thread_pool(self,thread_num): # 初始化线程池,将工作线程从队列取出放进线程池列表 for i in range(thread_num): self.threads.append(Work(self.work_queue)) def __init_work_queue(self, work_num): # 初始化工作队列,将所有的工作放进队列 for i in range(work_num): self.add_job(do_job, i) # 将实际的工作函数放进队列 def add_job(self, func, *args): # 添加一个工作入队列,func是实际的工作函数 self.work_queue.put((func, list(args))) # 将实际的工作函数添加入队列,参数args要用列表形式,queue.Queue内部实现了同步机制 def check_queue(self): # 检查剩余队列任务数量 return self.work_queue.qsize() def wait_all_complete(self): # 等待所有线程运行完毕 for item in self.threads: if item.isAlive(): # 判断线程是否是活动状态,如果是则等待线程执行结束 item.join() class Work(threading.Thread): # Work类就是处理单个线程,它负责从队列取出一个线程,并将该线程执行完毕 def __init__(self, work_queue): # 初始化一个工作线程,同时产生工作队列,其中work_queue是WorkManager类中初始化好的一个queue.Queue() threading.Thread.__init__(self) # 自动自行下边的run方法 self.work_queue = work_queue self.start() def run(self): # 重写run方法 # 死循环,从而让创建的线程在一定条件下关闭退出 while True: try: do, args = self.work_queue.get(block=False) # 任务异步出队,Queue内部实现了同步机制 # print('do:',do,'args:',args) do(args) # 从队列里取出线程,并执行,do是函数对象,args是线程号 self.work_queue.task_done() # 通知系统单个任务完成 except Exception as e: break def do_job(args): # 具体要做的任务 time.sleep(2) # 模拟处理时间 print(threading.current_thread(), list(args)) # 打印当前线程对象,和参数列表 if __name__ == '__main__': start = time.time() work_manager = WorkManager(10, 3) # 或者work_manager = WorkManager(10000, 20) work_manager.wait_all_complete() end = time.time() print("cost all time: %s" % (end-start))