使用with方式创建线程池,任务执行完毕之后,会自动关闭资源 , 否则就需要手动关闭线程池资源
import threading, time from concurrent.futures import ThreadPoolExecutor, as_completed class MyTask(threading.Thread): """ 使用python线程的方法 """ def __init__(self, thread_id): threading.Thread.__init__(self) self.thread_id = thread_id def run(self): while 1: print('%s线程正在运行。。。。。。。。' % self.thread_id) time.sleep(1) class MyThreadPool(object): """ 使用python线程池的两种方式 """ def __init__(self): """init方法,构造测试数据""" self.param_data = [] for i in range(1000): self.param_data.append(str(i)) def target_task(self, param): """目标方法""" print(threading.currentThread().name) # 打印当前线程的name # print(param) return param + '----------task' def execute_thread_pool_method1(self): """使用线程池的第一种方式""" '''创建一个线程池,里面有10个线程''' with ThreadPoolExecutor(max_workers=10, thread_name_prefix='test') as tpe: # 使用with,会自动关闭任务 result = [] # 缓存线程任务执行结果 for i in self.param_data: r = tpe.submit(self.target_task, i) # submit提交任务,执行的顺序是乱的 result.append(r) for r in as_completed(result): print(r.result()) tpe.shutdown() def execute_thread_pool_method2(self): """使用线程池的第二种方式""" '''创建一个线程池,里面有10个线程''' with ThreadPoolExecutor(10) as tpe: # 结果的数据类型就是list result = tpe.map(self.target_task, self.param_data) for r in result: # 对结果集进行处理 print(r) if __name__ == '__main__': my_task = MyTask(1) my_task.setDaemon(True) # 将my_task这个线程设置成守护线程 my_task.start() print(threading.active_count()) # 打印活着的线程数 # my_thread_pool = MyThreadPool() # my_thread_pool.execute_thread_pool_method1() # my_thread_pool.execute_thread_pool_method2()