concurrent库学习之ThreadPoolExecutor模块
一、简介
concurrent.futures.ThreadPoolExecutor
是 Python 标准库中的一个模块,用于管理线程池并行执行任务。它提供了一种高层次的接口来启动和管理线程,简化了并发编程的复杂性。
二、语法和参数
语法
python
concurrent.futures.ThreadPoolExecutor(max_workers=None, thread_name_prefix='', initializer=None, initargs=())
参数
max_workers
:线程池中允许的最大线程数。如果为None
或未指定,则默认值为os.cpu_count() * 5
。thread_name_prefix
:线程名称的前缀,用于标识线程。initializer
:每个工作线程在启动时调用的可调用对象。initargs
:传递给initializer
的参数元组。
三、实例
3.1 使用线程池执行简单任务
- 代码
python
import concurrent.futures
import time
def task(n):
print(f"Task {n} is running")
time.sleep(2)
return f"Task {n} completed"
with concurrent.futures.ThreadPoolExecutor(max_workers=3) as executor:
futures = [executor.submit(task, i) for i in range(5)]
for future in concurrent.futures.as_completed(futures):
print(future.result())
-
输出
Task 0 is running
Task 1 is running
Task 2 is running
Task 3 is running
Task 0 completed
Task 4 is running
Task 1 completed
Task 2 completed
Task 3 completed
Task 4 completed
3.2 使用线程池执行带有返回值的任务
- 代码
python
import concurrent.futures
def square(n):
return n * n
with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
results = list(executor.map(square, range(10)))
print(results)
-
输出
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
四、注意事项
ThreadPoolExecutor
适用于 I/O 密集型任务,而不是 CPU 密集型任务。对于 CPU 密集型任务,建议使用ProcessPoolExecutor
。- 确保正确管理线程池的生命周期,使用
with
语句可以自动管理资源。 - 在提交大量任务时,注意控制
max_workers
的数量,以避免线程过多导致系统资源耗尽。 - 使用
concurrent.futures.as_completed
可以按完成顺序获取任务结果,而不是提交顺序。