十三、线程池
线程池(掌握)
一、Future类
线程池的基类是 concurrent.futures 模块中的 Executor,Executor 提供了两个子类,即 ThreadPoolExecutor 和 ProcessPoolExecutor,其中 ThreadPoolExecutor 用于创建线程池,而 ProcessPoolExecutor 用于创建进程池。
'''
Future 提供了如下方法,线程进程通用:
cancel():取消该 Future 代表的线程任务。如果该任务正在执行,不可取消,则该方法返回 False;否则,程序会取消该任务,并返回 True。
cancelled():返回 Future 代表的线程任务是否被成功取消。
running():如果该 Future 代表的线程任务正在执行、不可被取消,该方法返回 True。
done():如果该 Funture 代表的线程任务被成功取消或执行完成,则该方法返回 True。
result(timeout=None):获取该 Future 代表的线程任务最后返回的结果。如果 Future 代表的线程任务还未完成,该方法将会阻塞当前线程,其中 timeout 参数指定最多阻塞多少秒。
exception(timeout=None):获取该 Future 代表的线程任务所引发的异常。如果该任务成功完成,没有异常,则该方法返回 None。
add_done_callback(fn):为该 Future 代表的线程任务注册一个“回调函数”,当该任务成功完成时,程序会自动触发该 fn 函数。
'''
1、ThreadPoolExecutor类
创建一个线程池,并指定线程池中的最大线程数
- 语法:
from concurrent.futures import ThreadPoolExecutor
pool = ThreadPoolExecutor(max_workers=None, thread_name_prefix='',initializer=None, initargs=())
'''
参数介绍:
max_workers:设置线程池可容纳的最大线程数
默认值:CPU内核数+4
int:也可以输入一个int类型的数值,指定最大线程数
thread_name_prefix:给线程的可选名称前缀。
默认值:为空
initializer:是每个工作线程启动时要执行的可调用对象,默认为None,即每次使用pool.submit()方法时
initargs:是要传给initializer的参数组
(实参1,实参2...)
'''
1.1 submit()
向线程池中提交任务(函数),是异步操作
程序将 task 函数提交(submit)给线程池后,submit 方法会返回一个 Future 对象,Future 类主要用于获取线程任务函数的返回值。由于线程任务会在新线程中以异步方式执行,因此,线程执行的函数相当于一个“将来完成”的任务,所以 Python 使用 Future 来代表。
- 语法:
from concurrent.futures import ThreadPoolExecutor
pool = ThreadPoolExecutor(max_workers=None, thread_name_prefix='',initializer=None, initargs=())
def zzw():
pass
pool.submit(fn, *args, **kwargs)
'''
参数介绍:
fn:创建线程时,需要执行的代码,由函数封装
*args:参数1, 参数2,...:传入func函数的参数
**kwargs:传入fn的可变参数
a = 11, b = 22
返回值:
返回一个_base.Future类
<class 'concurrent.futures._base.Future'>
Future类中的方法:
result():获取submit(fn)提交任务的返回结果,即fn函数的return值,并且在该子线程输出返回结果时,主线程阻塞
'''
1.2 shutdown()
关闭线程池,并原地阻塞等待线程池中所有的任务执行完毕
在用完一个线程池后,应该调用该线程池的 shutdown() 方法,该方法将启动线程池的关闭序列。调用 shutdown() 方法后的线程池不再接收新任务,但会将以前所有的已提交任务执行完成。当线程池中的所有任务都执行完成后,该线程池中的所有线程都会死亡。
- 语法:
from concurrent.futures import ThreadPoolExecutor
pool = ThreadPoolExecutor(max_workers=None, thread_name_prefix='',initializer=None, initargs=())
pool.shutdown(wait=True)
1.3 map()-了解
map(func, *iterables, timeout=None, chunksize=1):该函数类似于全局函数 map(func, *iterables),只是该函数将会启动多个线程,以异步方式立即对 iterables 执行 map 处理。

浙公网安备 33010602011771号