concurrent.futures #
concurrent.futures
模块确实是 Python 中进行并发编程的一个重要工具,它可以帮助我们更简单地执行异步任务,而不需要直接处理线程或进程的管理。
concurrent.futures
模块提供了一个用于异步执行callable对象的高级接口。
异步执行可以使用线程来执行,使用 ThreadPoolExecutor
,或者使用单独的进程,使用 ProcessPoolExecutor
。两者都实现了相同的接口,该接口由抽象 Executor
类定义。
future是一个封装函数调用的对象。该函数调用在后台执行,运行于单独的线程或进程。future对象具有检查计算是否已经完成并获得结果的方法。
ThreadPoolExecutor #
ThreadPoolExecutor
是基于线程池的,可以让我们轻松管理多个线程来异步执行任务。适合 I/O 密集型任务,如网络请求、文件读写等。
1import time
2from concurrent.futures import ThreadPoolExecutor, as_completed
3
4
5def do_work(val):
6 print(f"开始处理 {val}")
7 time.sleep(2) # 模拟需要2秒钟的工作
8 return f"结果: {val}"
9
10
11# 使用ThreadPoolExecutor创建线程池
12with ThreadPoolExecutor(max_workers=3) as executor:
13 # 提交多个任务到线程池
14 futures = [executor.submit(do_work, i) for i in range(5)]
15
16 # 获取并输出任务的结果
17 for future in as_completed(futures):
18 # 输出每个任务的执行结果
19 print(future.result())
上面的代码executor.submit()
用来提交任务,每个任务会被线程池中的一个线程异步执行。
concurrent.futures.as_completed(futures)
可以用来按完成的顺序获取每个任务的结果。
线程池设置了最多3个线程执行任务,但总共有5个任务会被提交到线程池。
ProcessPoolExecutor #
ProcessPoolExecutor是基于进程池的,它适用于CPU密集型任务,如大量的数学计算或数据处理等。每个任务都会在一个独立的进程中执行。
1import time
2from concurrent.futures import ProcessPoolExecutor, as_completed
3
4
5def compute_square(val):
6 print(f"正在计算 {val} 的平方")
7 time.sleep(1) # 模拟一些计算过程
8 return val * val
9
10
11# 使用ProcessPoolExecutor创建进程池
12with ProcessPoolExecutor(max_workers=3) as executor:
13 # 提交多个任务到进程池
14 futures = [executor.submit(compute_square, i) for i in range(5)]
15
16 # 获取并输出任务的结果
17 for future in as_completed(futures):
18 # 输出每个任务的执行结果
19 print(future.result())