【问题标题】:How to make API invocations async in tornado [duplicate]如何在龙卷风中使 API 调用异步 [重复]
【发布时间】:2017-05-25 11:25:09
【问题描述】:

我已经使用以下语句启动了我的网络服务器

tornado.ioloop.IOLoop.current().start()

我已经用@gen.coroutine 标记了我的方法并返回为yield 为了检查方法调用是否是异步的,我添加了 time.sleep(5) 但是方法调用都是同步的,它等待 5 秒并执行下一个语句,对 tornado 服务器的任何其他调用都只是等待第一个调用完成。如何使我的 APIS 异步

我的方法中没有任何 IO 调用,而是 CPU 密集型数学计算。

【问题讨论】:

    标签: python asynchronous web tornado


    【解决方案1】:

    来自龙卷风文档:

    原因是 time.sleep 是一个阻塞函数:它不允许控制返回到 IOLoop 以便其他处理程序可以运行。

    您可以阅读有关此here 的更多信息。

    您应该将 time.sleep 替换为对协程友好的等效 tornado.gen.sleep

    【讨论】:

      【解决方案2】:

      正如已经指出的那样,您可以使用tornado.gen.sleep 让您的协程与睡眠一起工作。但是,最终,这对您没有帮助。 异步编程是为您想要在有 IO 处理时进行额外处理的情况而设计的。当有 CPU 工作要做时,例程会继续运行。因此,即使您使用正确的异步原语,您也会在运行计算时阻塞。

      原则上,线程编程在这种情况下工作得更好,因为每个线程可以同时运行,从而在 CPU 密集型工作上取得进展。但是,这对 Python 帮助不大。由于 Python 中线程锁定的工作方式,基本上一次只能运行一个 Python 线程。 您可以查看多处理模块,看看是否可以在单独的进程中运行每个计算。这可能是高效利用 Python 的多 CPU 系统的最佳方式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-14
        相关资源
        最近更新 更多