执行程序中 运行 与定义异步方法之间的 Tornado 区别

Tornado difference between run in executor and defining async methods

我是 Tornado 的新手。我无法理解使用 run_on_executor 和定义 async 方法之间的区别。是一样的吗?一个是多线程另一个不是?

提前致谢。

来自文档

Utilities for working with Future objects.

Tornado previously provided its own Future class, but now uses asyncio.Future. This module contains utility functions for working with asyncio.Future in a way that is backwards-compatible with Tornado’s old Future implementation.

While this module is an important part of Tornado’s internal implementation, applications rarely need to interact with it directly.

据我所知,来自 tornado.concurrentrun_on_executor 是一种与 asyncio.Future 交互的方式,并且向后兼容旧 Tornado 的 Future

无论如何,任何基于 asyncio 的代码都没有使用多线程,它使用的是 coroutines

这个媒体 post 可以帮助您理解 asynciothreads 之间的区别:here

run_on_executor 用于与阻塞非异步代码交互。

异步代码仅在单线程中执行的说法是正确的。 也许一个例子可以说明这一点。

假设您的 Tornado 网络服务与一个库接口,该库使用 requests 获取给定 IP 地址的国家/地区信息。由于 requests 是非异步库,调用此函数将阻止 Tornado 事件循环。

因此,您有两个选择:尝试找到异步兼容的库的替代品或 运行 不同 thread/process 中的阻塞代码并让您的事件循环 await 它的结果与普通异步代码一样,不会阻塞事件循环。后一个选项是 run_on_executor,它允许您 运行 不同线程或进程中的任务,而 asyncio 将“等待”它的完成。