10.6.4 Future回调
要在任务完成时采取某个动作,不用显式地等待结果,可以使用add_donecallabck()指示future完成时要调用一个新函数。这个回调应当是有一个参数(Future实例)的callable函数。
from concurrent import futures
import time
def task(n):
print('{}:sleeping'.format(n))
time.sleep(0.5)
print('{}:done'.format(n))
return n / 10
def done(fn):
if fn.cancelled():
print('{}:canceled'.format(fn.arg))
elif fn.done():
error = fn.exception()
if error:
print('{}:error returned: {}'.format(
fn.arg,error))
else:
result = fn.result()
print('{}: value returned: {}'.format(
fn.arg,result))
if __name__ == '__main__':
ex = futures.ThreadPoolExecutor(max_workers=2)
print('main:starting')
f = ex.submit(task,5)
f.arg = 5
f.add_done_callback(done)
result = f.result()
不论由于什么原因,只要认为Future“完成”,就会调用这个回调,所以在使用它之前必须检查传入回调的对象的状态。
运行结果: