欢迎访问宙启技术站
智能推送

Python中concurrent.futuresas_completed()实现多线程任务并发执行

发布时间:2024-01-02 11:56:22

在Python中,使用concurrent.futures模块可以很方便地实现多线程任务的并发执行。其中concurrent.futures.as_completed()函数可以帮助我们获取任务的返回结果。

concurrent.futures模块提供了一个ThreadPoolExecutor类,它是一个线程池,可以用来管理和执行多个线程任务。

下面是一个示例,演示了如何使用concurrent.futures模块实现多线程任务的并发执行:

import concurrent.futures
import time

# 定义一个任务函数,用来模拟耗时操作
def task(n):
    # 模拟耗时操作
    time.sleep(1)
    return n * n

def main():
    # 创建一个线程池对象,最多同时执行5个任务
    executor = concurrent.futures.ThreadPoolExecutor(max_workers=5)

    # 提交任务到线程池并获取Future对象
    futures = [executor.submit(task, i) for i in range(1, 11)]

    # 使用concurrent.futures.as_completed()获取已经完成的任务
    for future in concurrent.futures.as_completed(futures):
        try:
            # 获取任务的返回结果
            result = future.result()
            print("任务返回结果:", result)
        except Exception as e:
            print("任务执行过程中发生异常:", e)

if __name__ == '__main__':
    main()

在上面的示例中,首先定义了一个耗时操作的函数task,该函数接收一个参数n,然后使用time.sleep(1)模拟一个耗时1秒的操作,最后返回n的平方。

在main函数中,先创建了一个ThreadPoolExecutor对象executor,它是一个线程池,最多同时执行5个任务。

然后使用executor.submit()方法提交任务到线程池,并得到一个Future对象。这个Future对象代表了一个待执行或正在执行的任务。

将所有的任务对象保存在一个列表futures中。

接下来,使用concurrent.futures.as_completed()函数,该函数返回一个迭代器,可以按照任务完成的顺序依次获取已经完成的任务对象。

然后就可以使用future.result()方法获取任务的返回结果。

这种方式可以确保每个任务完成后立即取得其返回值,而不必等待所有任务完成后再去获取结果。

同时,请注意捕获任务执行过程中可能抛出的异常。

在执行示例代码后,你会发现输出的任务返回结果是乱序的。这是因为concurrent.futures.as_completed()获取到的任务是按照完成的顺序返回的,而线程的执行顺序是不确定的。

通过使用concurrent.futures模块,可以方便地实现多线程任务的并发执行,提升程序的执行效率。同时,Python还提供了concurrent.futures.ProcessPoolExecutor类,用于实现多进程任务的并发执行,具体用法与ThreadPoolExecutor类类似。