2024-05-12 20:54:37 发布
网友
我已经使用下面的语句启动了我的web服务器
tornado.ioloop.IOLoop.current().start()
我用@协同程序以收益回报 为了检查方法调用是否是异步的,我添加了时间。睡觉(五) 但是方法调用都是同步的,它等待5秒,然后执行下一个语句,对tornado服务器的任何其他调用都将等待第一个调用完成。如何使我的API异步
我的方法中没有任何IO调用,而是CPU密集的数学计算。在
来自tornado docs:
The reason for this is that time.sleep is a blocking function: it doesn’t allow control to return to the IOLoop so that other handlers can be run.
你可以阅读更多关于这个here。在
您应该将time.sleep替换为对协程友好的等价物tornado.gen.sleep。在
time.sleep
tornado.gen.sleep
正如已经指出的,你可以使用tornado.gen.sleep来让你的协同程序与睡眠一起工作。然而,最终,这对你没有帮助。 异步编程是为这样一种情况而设计的:在有IO要处理的情况下,您希望执行附加处理。当有CPU工作要做时,例程继续运行。因此,即使使用正确的异步原语,在运行计算时也会阻塞。在
原则上,线程编程在这种情况下工作得更好,因为每个线程都可以同时运行,在CPU限制的工作上取得进展。但是,这对Python的帮助不大。由于Python中线程锁定的工作方式,基本上一次只能运行一个Python线程。 您可以查看多处理模块,看看是否可以在单独的进程中运行每个计算。这可能是高效利用Python的多CPU系统的最佳方法。在
来自tornado docs:
你可以阅读更多关于这个here。在
您应该将
time.sleep
替换为对协程友好的等价物tornado.gen.sleep
。在正如已经指出的,你可以使用
tornado.gen.sleep
来让你的协同程序与睡眠一起工作。然而,最终,这对你没有帮助。 异步编程是为这样一种情况而设计的:在有IO要处理的情况下,您希望执行附加处理。当有CPU工作要做时,例程继续运行。因此,即使使用正确的异步原语,在运行计算时也会阻塞。在原则上,线程编程在这种情况下工作得更好,因为每个线程都可以同时运行,在CPU限制的工作上取得进展。但是,这对Python的帮助不大。由于Python中线程锁定的工作方式,基本上一次只能运行一个Python线程。 您可以查看多处理模块,看看是否可以在单独的进程中运行每个计算。这可能是高效利用Python的多CPU系统的最佳方法。在
相关问题 更多 >
编程相关推荐