MST

星途 面试题库

面试题:Python concurrent.futures模块中的Future对象及异常处理

在使用concurrent.futures模块提交任务后会返回Future对象。请详细说明Future对象的常用方法,如result()、add_done_callback()等的作用及使用方式。当任务执行过程中出现异常时,如何通过Future对象获取并处理这些异常?请结合代码示例说明。
24.9万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

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()方法也可以捕获并处理异常。