我已使用以下声明启动了我的网络服务器
tornado.ioloop.IOLoop.current().start()
我用@ gen.coroutine标记了我的方法并返回为yield 为了检查方法调用是否是异步,我添加了time.sleep(5) 但方法调用都是同步的,它等待5秒并执行下一个语句,对tornado服务器的任何其他调用只是等待第一个调用完成。如何使我的APIS异步
我的方法中没有任何IO调用,但CPU密集型数学计算。
答案 0 :(得分:3)
来自龙卷风文档:
原因是time.sleep是一个阻塞函数:它不允许控制返回到IOLoop,以便可以运行其他处理程序。
您可以阅读有关此here的更多信息。
您应该将time.sleep
替换为与coroutine友好的等效tornado.gen.sleep
。
答案 1 :(得分:2)
正如已经指出的那样,您可以使用tornado.gen.sleep
让您的协同程序与睡眠一起工作。但是,最终,这对你没有帮助。
异步编程专为需要在处理IO时进行其他处理的情况而设计。在有CPU工作的情况下,例程继续运行。因此,即使您使用正确的异步原语,也会在运行计算时阻塞。
原则上,线程编程在这种情况下工作得更好,因为每个线程可以在CPU绑定工作的同时运行。但是,这对Python没有多大帮助。由于线程锁定在Python中的工作方式,基本上一次只能运行一个Python线程。 您可以查看多处理模块,看看是否可以在单独的进程中运行每个计算。这可能是有效使用Python多CPU系统的最佳方式。