一个python线程池的源码解析
python为了方便人们编程高度封装了很多东西,比如进程里的进程池,大大方便了人们编程的效率,但是默认却没有线程池,本人前段时间整理出一个线程池,并进行了简单的解析和注释,本人水平有限,如有错误希望高手指点,愿与君共同学习与进步,废话少说,上源码
import threading,time,queue stop = object() class Thread(object): def __init__(self,max_num):#构造函数 self.q = queue.Queue() #创建一个队列,存放任务 self.max_num = max_num #线程池最大线程数 self.terminal = False self.generate_list = [] #真实创建的线程列表 self.free_list = [] #空闲线程列表 def generate_thread(self): #创建进程并执行的函数 t = threading.Thread(target = self.call) t.start() def call(self): #获取任务并且执行任务函数 current_thread = threading.currentThread #获取当前线程 self.generate_list.append(current_thread) #加入列表 even = self.q.get() #从队列获取到任务 while even != stop:#在有 任务 的情况下循环执行任务 func,args,callback = even try: ret = func(args) #执行函数 status = True except Exception as e: #如果有错误status为假,执行结果fu赋值ret status = False ret = e if callback is not None:#判断如果没有回调函数 try: callback(status,ret) except Exception as e: pass if self.terminal: #p判断是否终止 even = stop else: self.free_list.append(current_thread) #执行完毕将线程加入空闲 even = self.q.get() #再次获取 self.free_list.remove(current_thread)#修改状态为非闲置 else: self.generate_list.remove(current_thread)#如果没有任务,会删除真实创建的线程列表中的元素 def run(self, func, args, callback=None): # 线程池运行的方法 w = (func, args, callback,) self.q.put(w) # 将任务放进队列 if len(self.free_list) == 0 and len(self.generate_list) < self.max_num:#判断是否创建线程 self.generate_thread() def close(self): #关闭线程函数 num = len(self.generate_list) while num: self.q.put(stop) num -= 1 def terminal(self): #一个可以在任务没执行完的情况下强制终止的函数, self.terminal = True# 根据 self.terminal判断 max_num = len(self.generate_list) while max_num: #放入列表长度的个数的stop结束正在阻塞的进程 self.q.put(stop) max_num -= 1#该方法清空了线程但是没清空队列任务 def terminall(self): # 一个可以在任务没执行完的情况下强制终止的函数, self.terminal = True # 根据 self.terminal判断 while self.generate_list:#如果列表不为空就会不断放入sotp清空线程列表 self.q.put(stop) self.q.empty()#线程清空完毕之后清空队列,完美。 def work(a): #以下为示例 print(a) pool = Thread(10) for i in range(50): pool.run(func=work,args=i) pool.close()