面试题答案
一键面试result() 方法
- 作用:获取Future代表的异步操作的结果。如果异步操作还未完成,调用该方法会阻塞当前线程,直到操作完成。
- 使用方式:
future.result(timeout=None)
,timeout
参数为可选,用于指定等待结果的最长时间,如果超过这个时间任务还未完成,会抛出TimeoutError
。
add_done_callback() 方法
- 作用:添加一个回调函数,当Future代表的异步操作完成(无论是正常完成还是异常完成)时,该回调函数会被调用。
- 使用方式:
future.add_done_callback(fn)
,fn
是一个可调用对象,它接受一个Future对象作为参数。
获取并处理异常
当任务执行过程中出现异常时,可以在调用result()
方法时捕获异常,或者在回调函数中通过future.exception()
方法获取异常。
以下是代码示例:
import concurrent.futures
def divide(a, b):
return a / b
with concurrent.futures.ThreadPoolExecutor() as executor:
future = executor.submit(divide, 1, 0)
def callback(future):
if future.exception():
print(f"任务执行出现异常: {future.exception()}")
else:
print(f"任务执行结果: {future.result()}")
future.add_done_callback(callback)
try:
result = future.result()
print(f"通过 result 获取结果: {result}")
except ZeroDivisionError as e:
print(f"通过 result 捕获异常: {e}")
在上述代码中,divide
函数故意制造了一个除零异常。add_done_callback
中的回调函数通过future.exception()
检查并处理异常,同时result()
方法也可以捕获并处理异常。