【问题标题】:Use asyncio methods on tornado's ioloop (such as create_future)在 tornado 的 ioloop 上使用 asyncio 方法(例如 create_future)
【发布时间】:2020-03-28 22:48:53
【问题描述】:

我知道,由于 5.0 龙卷风的 ioloop 由 asyncio 处理,实际上我使用 tornado.ioloop.IOloop.current() 默认情况下的循环是 asyncio 循环。我的问题是如何以适当的方式访问 asyncio 循环本身。例如我想在 asyncio 循环上使用 loop.create_future() 方法,但是 tornado 包装了循环并且它没有这个方法。

目前我所做的是当我需要异步方法时,我只需调用asyncio.get_event_loop()(因为文档指出这两个循环确实是相同的)。我不确定这是不是正确的方法,因为现在我对具有不同接口的同一个 ioloop 有不同的引用,我使用了需要的那个。这有点混乱和混乱。

有没有更好的方法?我可以告诉龙卷风给我异步循环而不包装它吗?或者我可以使用 tornado 创建的 IOloop 以某种方式访问​​这些方法吗?

编辑:

https://www.tornadoweb.org/en/stable/ioloop.html#module-tornado.ioloop 这里声明如下:

应用程序可以直接使用 IOLoop 接口或底层异步事件循环

我对后者感兴趣,但我找不到有关如何直接访问它的说明。

【问题讨论】:

  • 你试过asyncio的顶级函数吗,比如asyncio.ensure_future?事件循环通常为其有效负载发布。
  • 在我提到的特定用例中(但我宁愿一般性地问这个问题)我必须创建一个 asyncio.Future 对象,并且 asyncio 的文档明确指出,要正确执行此操作,您需要调用 @987654328 @ 在循环上。 docs.python.org/3/library/…我错过了什么,是否有一个顶级方法可以在龙卷风中使用所有内容?

标签: python python-3.x tornado python-asyncio ioloop


【解决方案1】:

asyncio.get_event_loop() 是推荐的方法;无需使用(未记录的)asyncio_loop 属性。这就是所有非 Tornado 特定的 asyncio 代码获取事件循环的方式。

【讨论】:

  • 感谢您的回答!因此,如果我已经使用 tornado 的 ioloop 来调用 add_callback 等,如果我想使用 tornado 的 ioloop 上不存在的方法,例如@987654324,通过asyncio.get_event_loop() 获取对 asyncio_loop 的引用是否被认为是一种好习惯@?还是我应该在任何地方都使用 asyncio?
  • 如果可能的话,最好避免将两个事件循环混合在同一个代码块中。如果您已经为create_future 提供了一个异步循环,请使用它的call_soon 而不是add_callback。但如果您确实需要两个循环的独特功能,只需使用 IOLoop.current()asyncio.get_event_loop()
【解决方案2】:

我终于找到了办法。因此,tornado 创建的 ioloop 将是 AsyncIOMainLoop 类型。我去了源代码,它的基类是BaseAsyncIOLoop,在那个类中有一个属性叫做asyncio_loop

这样我终于可以使用 asyncio 循环了。 (ioloop.IOLoop.current().asyncio_loop)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    • 1970-01-01
    • 2020-08-02
    • 1970-01-01
    相关资源
    最近更新 更多