我有一个连接到给定URL的Flask应用程序,可以与外部服务(响应时间通常很长)连接并在那里搜索一些内容。之后对检索得到的数据进行了一些需要占用大量CPU时间的操作。这也需要一些时间。
我的问题是:来自外部的响应可能会花费一些时间。你无法做太多事情,但当你有多个请求时,它就成为了一个大问题——flask请求外部服务会阻塞线程,其他请求就必须等待。
这显然是浪费时间,而且会导致应用程序崩溃。
我听说过这个名为Tornado的异步库,这引发了我的几个问题:
我的问题是:来自外部的响应可能会花费一些时间。你无法做太多事情,但当你有多个请求时,它就成为了一个大问题——flask请求外部服务会阻塞线程,其他请求就必须等待。
这显然是浪费时间,而且会导致应用程序崩溃。
我听说过这个名为Tornado的异步库,这引发了我的几个问题:
- 这是否意味着它可以处理多个请求,并在外部响应后立即触发回调?
- 我能否在我的当前Flask应用程序中实现这一点(可能不行,因为我猜WSGI的原因?),或者我需要重新编写整个应用程序以使用Tornado?
- 那些需要占用大量CPU时间的操作怎么办?它们是否会阻塞我的线程?无论如何进行一些负载平衡都是个好主意,但我很好奇Tornado如何处理这些操作。
- 有什么可能的陷阱和注意事项吗?
@tornado.gen.coroutine
装饰器并不能使其异步化。您还必须在处理程序内部实际进行非阻塞调用。如果在函数中执行任何阻塞操作,整个事件循环都将被阻塞,无论您是否使用coroutine
装饰器。 - danogrequests
使用gevent
提供异步 I/O,没错。如果你正在使用tornado
,你可能想要使用它内置的AsyncHTTPClient
,因为它与 tornado 事件循环集成。 - dano