青蛙小白
目录

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 密集型任务,如网络请求、文件读写等。

import time
from concurrent.futures import ThreadPoolExecutor, as_completed


def do_work(val):
    print(f"开始处理 {val}")
    time.sleep(2)  # 模拟需要2秒钟的工作
    return f"结果: {val}"


# 使用ThreadPoolExecutor创建线程池
with ThreadPoolExecutor(max_workers=3) as executor:
    # 提交多个任务到线程池
    futures = [executor.submit(do_work, i) for i in range(5)]

    # 获取并输出任务的结果
    for future in as_completed(futures):
        # 输出每个任务的执行结果
        print(future.result())

上面的代码executor.submit()用来提交任务,每个任务会被线程池中的一个线程异步执行。 concurrent.futures.as_completed(futures)可以用来按完成的顺序获取每个任务的结果。 线程池设置了最多3个线程执行任务,但总共有5个任务会被提交到线程池。

ProcessPoolExecutor

ProcessPoolExecutor是基于进程池的,它适用于CPU密集型任务,如大量的数学计算或数据处理等。每个任务都会在一个独立的进程中执行。

import time
from concurrent.futures import ProcessPoolExecutor, as_completed


def compute_square(val):
    print(f"正在计算 {val} 的平方")
    time.sleep(1)  # 模拟一些计算过程
    return val * val


# 使用ProcessPoolExecutor创建进程池
with ProcessPoolExecutor(max_workers=3) as executor:
    # 提交多个任务到进程池
    futures = [executor.submit(compute_square, i) for i in range(5)]

    # 获取并输出任务的结果
    for future in as_completed(futures):
        # 输出每个任务的执行结果
        print(future.result())
评论