阅读(3237) (1)

Tornado 使用 Future 对象

2022-03-11 09:51:27 更新

用于处理 ​Future对象的实用程序。

Tornado 之前提供了自己的 ​Future类,但现在使用 ​asyncio.Future​。 此模块包含用于与 Tornado 的旧 ​Future实现向后兼容的方式使用 ​asyncio.Future 的实用程序函数。

虽然这个模块是 Tornado 内部实现的重要组成部分,但应用程序很少需要直接与其交互。

class tornado.concurrent.Future

tornado.concurrent.Future​ 是 ​asyncio.Future​ 的别名。

在 Tornado 中,应用程序与 ​Future​对象交互的主要方式是在协程中​awaiting​或​yielding​它们,而不是调用 ​Future对象本身的方法。

在 5.0 版更改:Tornado 的 ​Future实现已被 ​asyncio的版本取代(如果可用)。

  • Future​对象只能在存在当前 ​IOLoop时创建
  • 使用 ​Future.add_done_callback​ 安排的回调时间已更改。
  • 现在部分支持取消(仅在 Python 3 上)
  • exc_info和 ​set_exc_info方法在 Python 3 上不再可用。

tornado.concurrent.run_on_executor(*args, **kwargs) → Callable

装饰器在执行器上异步运行同步方法。

返回一个​future​。

要使用的​executor​由​self​的​executor​属性决定。 要使用不同的属性名称,请将关键字参数传递给装饰器:

@run_on_executor(executor='_thread_pool')
def foo(self):
    pass

此装饰器不应与名称相似的 ​IOLoop.run_in_executor​ 混淆。 一般来说,建议在调用阻塞方法时使用 ​run_in_executor而不是在定义方法时使用此装饰器。 如果需要与旧版本的 Tornado 兼容,请考虑在调用站点定义执行器并使用 ​executor.submit()

在 4.2 版更改: 添加了关键字参数以使用替代属性。

在 5.0 版更改: 始终使用当前 IOLoop 而不是 ​self.io_loop​。

在 5.1 版更改: 返回与 ​await兼容的 ​Future而不是 ​concurrent.futures.Future​。

5.1 版后已弃用:​callback​参数已弃用,将在 6.0 中删除。 装饰器本身在新代码中不鼓励使用,但不会在 6.0 中删除。

在 6.0 版更改: ​callback​参数已删除。

tornado.concurrent.chain_future(a: Future[_T], b: Future[_T]) → None

将两个 future 链接在一起,这样当一个完成时,另一个也完成。

a 的结果(成功或失败)将被复制到 b,除非 b 已经完成或在 a 完成时取消。

在 5.0 版更改: 现在接受 Tornado/asyncio ​Future对象和 ​concurrent.futures.Future​。

tornado.concurrent.future_set_result_unless_cancelled(future: Union[futures.Future[_T], Future[_T]], value: _T) → None

如果未取消,则将给定值设置为 ​Future的结果。

在取消的 ​asyncio.Future 上调用 ​set_result()​ 时避免 ​asyncio.InvalidStateError​。

tornado.concurrent.future_set_exception_unless_cancelled(future: Union[futures.Future[_T], Future[_T]], exc: BaseException) → None

将给定的 ​exc设置为 ​Future的异常。

如果 ​Future已被取消,则改为记录异常。 如果不需要此日志记录,则调用者应显式检查 ​Future的状态并调用 ​Future.set_exception​ 而不是此包装器。

在取消的 ​asyncio.Future​ 上调用 ​set_exception()​ 时避免 ​asyncio.InvalidStateError​。

tornado.concurrent.future_set_exc_info(future: Union[futures.Future[_T], Future[_T]], exc_info: Tuple[Optional[type], Optional[BaseException], Optional[traceback]]) → None

将给定的 ​exc_info设置为 ​Future的异常。

了解 ​asyncio.Future​ 和旧版本 Tornado 中的扩展,以便在 Python 2 上实现更好的回溯。

5.0 版中的新功能。

在 6.0 版更改: 如果​future​已经取消,则此功能是空操作。 (以前会引发 ​asyncio.InvalidStateError​)

tornado.concurrent.future_add_done_callback(future: Union[futures.Future[_T], Future[_T]], callback: Callable[[...], None]) → None

安排在​future​完成时调用​callback​。

callback​由​future​参数调用的。

如果 ​future已经完成,则立即调用​callback​。 这可能与 ​Future.add_done_callback​ 的行为不同,后者不做这样的保证。