Future可以把它当做是一个在将来要完成的动作。一般而言,执行io操作访问url时在等待结果返回前会产生阻塞,CPU不能做其他事情,只能傻等。因此引入Future就是为了帮助我们在CPU傻等的这段时间内完成一些其他的事情。
Future类封装了可调用的异步执行。Future实例通过Executor.submit()方法来创建。
1 常用方法
cancel():试图取消应用。如果调用当前正在执行,并且不能被取消,那么该方法将返回False。否则调用将被取消,方法将返回True。
cancelled():如果成功取消调用,返回True
running():如果调用当前正在执行并且不能被取消,返回True
done():如果调用成功取消或者结束了,返回True
result(timeout=None):返回调用返回的值。如果调用还没有完成,则该方法将等待超时timeout秒。若在timeout秒内调用还未完成,抛出Futures.TimeoutError异常。
exception(timeout=None):返回调用抛出的异常,若调用还未完成,则等待timeout秒,若超过timeout秒还未完成,则抛出超时错误。
Futures.TimeoutError:timeout取值为int或者float,若不指定或者指定值为None,等待时间无限长。若futures在完成之前被取消,则抛出CancelledError异常。若调用完成且无异常,返回None
add_done_callback(fn):将可调用对象fn绑定到future上,当future被取消或结束运行,fn作为future唯一的参数将会被调用。如果future已经运行完成或被取消,fn会立即被调用。
wait(fs,timeout=None,return_when=ALL_COMPLETED):等待fs提供的Future实例。
return_when:表明函数返回的时机。它的取值有以下几种
FIRST_COMPLETED:函数在任何future结束或者取消时返回
FIRST_EXCEPTION:函数在任何future因为异常结束的时候返回,如果没有future异常,效果等同于ALL_COMPLETED
ALL_COMPLETED:函数在所有future结束后才返回。
as_completed(fs, timeout=None):参数是一个Future实例,返回值是一个迭代器,在运行结束后产生Future实例
2 使用实例
from concurrent.futures import ThreadPoolExecutor,wait, as_completed
from time import sleep
from random import randint
def return_after_5_secs(num):
sleep(randint(1, 10))
return f"Return of {num}"
pool = ThreadPoolExecutor(5)
futures = []
for x in range(5):
futures.append(pool.submit(return_after_5_secs, x))
print(1)
for x in as_completed(futures):
print(x.result())
print(2)
result:
1
Return of 4
Return of 0
Return of 2
Return of 3
Return of 1
2