concurrent.futures

concurrent.futures #

https://docs.python.org/3/library/concurrent.futures.html

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())
© 2025 青蛙小白 | 总访问量 | 总访客数