# !/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))