【问题标题】: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 系统的最佳方式。