十三、线程池

线程池(掌握)

一、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类

创建一个线程池,并指定线程池中的最大线程数

  1. 语法:
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 来代表。

  1. 语法:
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() 方法后的线程池不再接收新任务,但会将以前所有的已提交任务执行完成。当线程池中的所有任务都执行完成后,该线程池中的所有线程都会死亡。

  1. 语法:
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 处理。
posted @ 2021-06-04 13:49  zzwYYYYYY  阅读(81)  评论(0)    收藏  举报