2017-05-25 112 views
0

API调用异步I已经使用下面的语句如何让龙卷风

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

我已经打上我的方法与@ gen.coroutine并返回屈服 为了检查方法,开始了我的Web服务器调用是异步的,我增加了time.sleep(5) ,但方法调用都是同步的,它等待5秒,执行下一个语句,任何其他调用龙卷风服务器只是等待第一个调用完成。如何使我的APIS异步

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

回答

2

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

原则上,线程编程在这种情况下效果更好,因为每个线程可以同时在CPU绑定的工作上运行。但是,这对Python来说无能为力。由于线程锁定在Python中的工作方式,基本上一次只能运行一个Python线程。 您可以查看多处理模块,看看您是否可以在单独的进程中运行每个计算。这可能是有效利用Python的多CPU系统的最佳方式。

3

从龙卷风文档:

这样做的原因是,time.sleep是一个阻塞函数:它不允许控制返回IOLoop,以便其他处理器可以运行。

您可以阅读更多关于此here

您应该用协程相同的tornado.gen.sleep代替time.sleep