使用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)会限制多线程的并行执行。
