📅  最后修改于: 2023-12-03 15:19:11.295000             🧑  作者: Mango
在 Python 中,线程池是实现多线程并发处理的一种方式。线程池可以维护一定数量的线程,而不是在每个任务到达时都创建一个新的线程,从而避免了线程频繁创建销毁的开销,并且可以提高线程的重用率。
Python 标准库中提供了线程池的实现,即 concurrent.futures
模块。该模块提供了 ThreadPoolExecutor
和 ProcessPoolExecutor
两个类,分别用于创建线程池和进程池。
ThreadPoolExecutor
类ThreadPoolExecutor
类用于创建线程池,其构造方法如下:
ThreadPoolExecutor(max_workers=None, thread_name_prefix='')
max_workers
:线程池中最多有多少个线程,默认为 None
,此时根据需要自行创建线程。thread_name_prefix
:生成线程的名称前缀,默认为空字符串。ThreadPoolExecutor
类提供了两个方法来提交任务:
submit(fn, *args, **kwargs)
:提交一个可调用对象,返回 Future
对象。map(func, *iterables, timeout=None, chunksize=1)
:在线程池中并发执行可调用对象,返回一个迭代器,支持超时设置和分块处理。Future
类表示异步计算的结果。可以通过以下方法获取 Future
对象的计算结果:
result(timeout=None)
:等待计算完毕并返回结果,默认不设置超时时间。add_done_callback(fn)
:给 Future
对象添加回调函数,在计算完成时自动调用。下面是一个使用 ThreadPoolExecutor
类实现线程池并发执行任务的示例:
import concurrent.futures
def task(num):
return num * num
with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
futures = [executor.submit(task, i) for i in range(10)]
for future in concurrent.futures.as_completed(futures):
print(future.result())
运行结果如下:
0
1
4
9
16
25
36
49
64
81
上述代码中,我们定义了一个 task
函数,用来计算一个数的平方。通过 ThreadPoolExecutor
类的 submit
方法将 task
函数提交到线程池中,并返回 Future
对象。最后通过 concurrent.futures.as_completed
函数按照任务完成的顺序获取结果。
线程池是实现多线程并发处理的一种方式,可以提高程序的效率和并发处理能力,避免线程频繁创建销毁的开销。Python 标准库中提供了 concurrent.futures
模块,其中的 ThreadPoolExecutor
类可以用于在 Python 中创建线程池。