Python中concurrent.futuresas_completed()实现多线程任务并发执行
在Python中,使用concurrent.futures模块可以很方便地实现多线程任务的并发执行。其中concurrent.futures.as_completed()函数可以帮助我们获取任务的返回结果。
concurrent.futures模块提供了一个ThreadPoolExecutor类,它是一个线程池,可以用来管理和执行多个线程任务。
下面是一个示例,演示了如何使用concurrent.futures模块实现多线程任务的并发执行:
import concurrent.futures
import time
# 定义一个任务函数,用来模拟耗时操作
def task(n):
# 模拟耗时操作
time.sleep(1)
return n * n
def main():
# 创建一个线程池对象,最多同时执行5个任务
executor = concurrent.futures.ThreadPoolExecutor(max_workers=5)
# 提交任务到线程池并获取Future对象
futures = [executor.submit(task, i) for i in range(1, 11)]
# 使用concurrent.futures.as_completed()获取已经完成的任务
for future in concurrent.futures.as_completed(futures):
try:
# 获取任务的返回结果
result = future.result()
print("任务返回结果:", result)
except Exception as e:
print("任务执行过程中发生异常:", e)
if __name__ == '__main__':
main()
在上面的示例中,首先定义了一个耗时操作的函数task,该函数接收一个参数n,然后使用time.sleep(1)模拟一个耗时1秒的操作,最后返回n的平方。
在main函数中,先创建了一个ThreadPoolExecutor对象executor,它是一个线程池,最多同时执行5个任务。
然后使用executor.submit()方法提交任务到线程池,并得到一个Future对象。这个Future对象代表了一个待执行或正在执行的任务。
将所有的任务对象保存在一个列表futures中。
接下来,使用concurrent.futures.as_completed()函数,该函数返回一个迭代器,可以按照任务完成的顺序依次获取已经完成的任务对象。
然后就可以使用future.result()方法获取任务的返回结果。
这种方式可以确保每个任务完成后立即取得其返回值,而不必等待所有任务完成后再去获取结果。
同时,请注意捕获任务执行过程中可能抛出的异常。
在执行示例代码后,你会发现输出的任务返回结果是乱序的。这是因为concurrent.futures.as_completed()获取到的任务是按照完成的顺序返回的,而线程的执行顺序是不确定的。
通过使用concurrent.futures模块,可以方便地实现多线程任务的并发执行,提升程序的执行效率。同时,Python还提供了concurrent.futures.ProcessPoolExecutor类,用于实现多进程任务的并发执行,具体用法与ThreadPoolExecutor类类似。
