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