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

使用concurrent.futures.threadThreadPoolExecutor()实现高效并行计算

发布时间:2023-12-15 05:49:30

concurrent.futures是Python标准库中的一个模块,提供了一个高层次的接口,用于异步执行可调用对象。其中,ThreadPoolExecutor是其中的一个类,它实现了一个线程池,用于执行并行计算任务。通过使用ThreadPoolExecutor,我们可以高效地并行执行任务,提高计算效率。

下面是一个使用ThreadPoolExecutor实现高效并行计算的例子,具体说明了该模块的使用方法。

import concurrent.futures
import time

# 定义一个需要计算的任务
def compute_square(num):
    time.sleep(1) # 模拟计算任务,睡眠1秒
    return num * num

if __name__ == '__main__':
    # 创建一个包含4个线程的线程池
    with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
        # 提交任务到线程池
        # 在该例子中,我们提交了10个任务
        # compute_square函数会被并行执行,每个任务的计算结果会被返回
        results = [executor.submit(compute_square, i) for i in range(10)]
        
        # 获取结果
        # 当结果准备好时,as_completed函数返回一个迭代器,迭代器的顺序与提交任务时的顺序一致
        for future in concurrent.futures.as_completed(results):
            result = future.result()
            print(result)

在上面的例子中,我们首先定义了一个需要计算的任务compute_square,该任务会对传入的参数进行平方计算。然后,我们通过ThreadPoolExecutor创建了一个包含4个线程的线程池。接着,我们使用executor.submit方法提交了10个任务到线程池中并获取了一个Future对象的列表。

Future对象代表了一个尚未完成的计算任务,在任务完成后,可以通过result方法获取计算结果。我们通过as_completed函数返回的迭代器,按照任务完成的顺序,依次获取并输出结果。

在实际应用中,你可以根据实际的计算任务和硬件资源进行调整,选择合适的线程池大小来提高计算效率。同时要注意,ThreadPoolExecutor将任务的并行计算限制在一个进程的多个线程中,适用于CPU密集型的任务。如果任务是IO密集型的,可以考虑使用concurrent.futures.ProcessPoolExecutor来利用多个进程并行执行任务。