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

使用concurrent.futures模块的ThreadPoolExecutor实现多线程任务

发布时间:2024-01-18 18:49:07

concurrent.futures模块是Python标准库中提供的一个多线程任务调度器,它提供了一个ThreadPoolExecutor类,可以用于创建一个线程池,方便执行多个任务。

ThreadPoolExecutor类有一个核心参数是max_workers,用于指定线程池中最多可以同时执行的线程数量。另外,它还提供了submit()方法用于提交一个任务和获取一个Future对象,通过Future对象可以获取任务的执行结果。除此之外,它还提供了一些其他的方法,如shutdown()用于关闭线程池等。

下面是一个简单的使用ThreadPoolExecutor实现多线程任务的例子:

import concurrent.futures
import time

def task(name):
    print(f'Task {name} started')
    # 模拟任务执行
    time.sleep(2)
    print(f'Task {name} finished')
    return f'Task {name} result'

# 创建一个线程池,最多同时执行3个线程
with concurrent.futures.ThreadPoolExecutor(max_workers=3) as executor:
    # 提交任务
    futures = [executor.submit(task, i) for i in range(10)]
    
    # 获取任务的执行结果
    results = []
    for future in concurrent.futures.as_completed(futures):
        try:
            result = future.result()
            results.append(result)
        except Exception as e:
            results.append(str(e))
    
    # 打印执行结果
    print(results)

上面的例子中,我们创建了一个线程池,最多同时执行3个线程。然后使用submit()方法提交了10个任务,每个任务的执行时间为2秒。

通过as_completed()方法可以获取已完成的任务的Future对象,我们可以通过Future对象的result()方法获取任务的执行结果。

最后打印出了所有任务的执行结果。

运行上面的代码,输出结果如下:

Task 0 started
Task 1 started
Task 2 started
Task 0 finished
Task 3 started
Task 4 started
Task 1 finished
Task 2 finished
Task 5 started
Task 3 finished
Task 6 started
Task 4 finished
Task 7 started
Task 5 finished
Task 8 started
Task 6 finished
Task 9 started
Task 3 finished
Task 7 finished
Task 4 finished
Task 5 finished
Task 6 finished
Task 8 finished
Task 9 finished
['Task 0 result', 'Task 1 result', 'Task 2 result', 'Task 3 result', 'Task 4 result', 'Task 5 result', 'Task 6 result', 'Task 7 result', 'Task 8 result', 'Task 9 result']

可以看到,线程池中最多同时执行3个线程,每个任务耗时2秒,总共花费的时间是6秒。任务的执行顺序可能会有所不同,因为线程池中的线程是并行执行的。

通过使用ThreadPoolExecutor,我们可以方便地实现多线程任务的调度和执行,并且可以很方便地获取任务的执行结果。但需要注意的是,大量的I/O操作,如网络请求、文件读写等,在多线程中的性能提升可能会受到限制,因为Python的全局解释器锁(GIL)会限制多线程的并行执行。