############### 线程池 ##############
""" 池 —— concurrent.futures Python标准模块--concurrent.futures concurrent.futures模块提供了高度封装的异步调用接口,其中: ThreadPoolExecutor:线程池 ProcessPoolExecutor: 进程池 借助上面两个类,我们可以很方便地创建进程池对象和线程池对象。 p_pool = ProcessPoolExecutor(max_workers=5) # 创建一个最多5个woker的进程池 t_pool = ThreadPoolExecutor(max_workers=5) # 创建一个最多5个woker的线程池 可用方法介绍: # 基本方法 # submit(fn, *args, **kwargs) 提交任务 # map(func, *iterables, timeout=None, chunksize=1) 取代for循环submit的操作
# shutdown(wait=True) 相当于进程池的pool.close()+pool.join()操作 wait=True,等待池内所有任务执行完毕回收完资源后才继续 wait=False,立即返回,并不会等待池内的任务执行完毕 但不管wait参数为何值,整个程序都会等到所有任务执行完毕 submit和map必须在shutdown之前
# result(timeout=None) 取得结果 # add_done_callback(fn) 回调函数 """
线程池的使用:
from concurrent.futures import ThreadPoolExecutor import time def func(n): time.sleep(2) print(n) return n*n tpool = ThreadPoolExecutor(max_workers=5) # 进程池,启动cpu核数+1. # 而线程池的启动是cpu核数 * 5 不要超过这个, t_list = [] for i in range(20): t = tpool.submit(func,i) # 提交一个任务,传递一个参数, t_list.append(t) tpool.shutdown() # shutdown做了两个事情: # 1,colse 关闭这个池子,不让有任务进来, # 2,join是阻塞,直到这个池子的任务执行完, # 所以是一个shutdown做了两个事情, print("主进程") for t in t_list:print(t.result())