#!/usr/bin/env python # -*- coding:utf-8 -*- import queue import threading import contextlib import time StopEvent = object() #定义标记的意义在于任务结束后退出的标记 class ThreadPool(object): def __init__(self, max_num): self.q = queue.Queue() #定义队列无限大 self.max_num = max_num #定义最大值 self.terminal = False #定义为false self.generate_list = [] #多少个进程正在执行 self.free_list = [] #定义空闲列表--空闲线程 初始化各种属性 def run(self, func, args, callback=None): """ 线程池执行一个任务 :param func: 任务函数 :param args: 任务函数所需参数 :param callback: 任务执行失败或成功后执行的回调函数,回调函数有两个参数1、任务函数执行状态;2、任务函数返回值(默认为None,即:不执行回调函数) :return: 如果线程池已经终止,则返回True否则None """ if len(self.free_list) == 0 and len(self.generate_list) < self.max_num: self.generate_thread() w = (func, args, callback,) self.q.put(w) def generate_thread(self): """ 创建一个线程 """ t = threading.Thread(target=self.call)#并执行call方法 t.start() def call(self): """ 循环去获取任务函数并执行任务函数 """ current_thread = threading.currentThread #拿到当前线程 self.generate_list.append(current_thread) #添加到正在使用线程队列 event = self.q.get() #--这里是一个获取到的元组w=().... while event != StopEvent: func, arguments, callback = event # w= (func, args, callback) try: result = func(*arguments) #执行任务 ret = aaa() --def aaa(): return 1 status = True except Exception as e: #如果我这个任务报错 status = False result = e if callback is not None: #这是一个返回值 try: callback(status, result) except Exception as e: pass self.free_list.append(current_thread) #---记得看上下文代码,执行完任务,把这个线程放到空闲队列里面 event = self.q.get()#当前的状态应该是没任务,线程等待任务,不结束 self.free_list.remove(current_thread) #获取任务移除休息线程 else: if event = StopEvent: self.generate_list.remove(current_thread) #移除当前正在运行的线程,等他运行完 def close(self): num = len(self.generate_list) while num: self.q.put(StopEvent)# num -= 1 import time def work(i): print(i) pool = ThreadPool(10) #定义最大线程为10个,实例化,并初始化 for item in range(50): #创建了50个任务 pool.run(func=work, args=(item,)) #执行work函数,args是传参 pool.close() #关闭线程池 理解注释版线程池