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

Python并行编程技巧:使用concurrent.futuresas_completed()调度任务

发布时间:2024-01-02 11:59:43

在Python中,通过使用concurrent.futures模块可以轻松实现并行编程。concurrent.futures模块提供了一个高级接口,用于在多个线程或进程中执行并发任务。

其中,concurrent.futures.as_completed()函数是一个非常强大的调度器,它允许您同时提交多个任务,并在任务完成时立即返回结果。在这个函数中,我们可以通过迭代返回的结果来获取已完成的任务的结果。

下面是一个示例,展示了如何使用concurrent.futures.as_completed()来并行执行多个任务:

import concurrent.futures
import time

# 定义一个简单的任务函数
def task(n):
    print(f"Task {n} started")
    time.sleep(1)  # 暂停1秒钟模拟任务执行
    print(f"Task {n} completed")
    return f"Result of Task {n}"

if __name__ == "__main__":
    # 创建一个ThreadPoolExecutor对象,指定最大线程数为3
    with concurrent.futures.ThreadPoolExecutor(max_workers=3) as executor:
        # 提交5个任务到线程池中
        futures = [executor.submit(task, i) for i in range(5)]

        # 使用as_completed()调度任务并获取结果
        for future in concurrent.futures.as_completed(futures):
            result = future.result()
            print(result)

在上面的示例中,我们首先定义了一个简单的任务函数task(),它会打印任务开始和结束的信息,并通过time.sleep()函数模拟任务的执行。然后,我们使用ThreadPoolExecutor对象创建了一个线程池,并将5个任务提交到线程池中。

接下来,我们使用concurrent.futures.as_completed()迭代已完成的任务。通过在循环中使用future.result()方法,我们可以获取已完成任务的结果。

运行上面的代码,你将看到任务在不同的线程中并行执行。由于我们指定了最大线程数为3,因此任务将会交替执行。输出结果可能类似于以下内容:

Task 0 started
Task 1 started
Task 2 started
Task 0 completed
Result of Task 0
Task 1 completed
Task 3 started
Result of Task 1
Task 2 completed
Task 4 started
Result of Task 2
Result of Task 3
Task 4 completed
Result of Task 4

注意,虽然我们提交了5个任务,但是线程池中最大线程数为3,因此最多只有3个任务会同时执行。任务的完成顺序可能会有所不同,因为任务的执行时间是随机的。

总结起来,concurrent.futures.as_completed()函数是一个非常实用的工具,允许您在并行执行多个任务时立即获取已完成任务的结果。通过合理设置最大线程数,您可以充分发挥计算机的多核处理能力,提高程序的执行效率。