优化异步 Tornado 代码。最小化线程锁

Optimize Async Tornado code. Minimize the thread lock

如何使用 Tornado 最小化线程锁?实际上,我已经有了工作代码,但我怀疑它不是完全异步的。

我有一个很长的任务。 它包括向 CouchDB 发出多个请求以获取元数据并构建最终的 link。然后我需要向 CouchDB 发出最后一个请求并流式传输文件(从 10 MB 到 100 MB)。因此,结果将是将大文件流式传输到客户端。

服务器可以同时接收100个下载大文件的请求,我不需要锁定线程并不断接收新请求(我必须最小化线程锁定)的问题。

所以,我正在发出几个同步请求(requests 库),然后用 AsyncHttpClient.

流式传输一个包含块的大文件

题目如下:

1) 我应该在任何地方都使用 AsyncHTTPClient 吗?因为我有一些接口,所以用异步请求替换所有同步请求会花费很多时间。值得吗?

2) 我应该使用 tornado.curl_httpclient.CurlAsyncHTTPClient 吗?代码 运行 会更快(文件下载、发出请求)吗?

3) 我看到 Python 3.5 引入了 async 并且理论上它可以更快。我应该使用异步还是继续使用装饰器 @gen.coroutine?

使用 AsyncHTTPClient 或 CurlAsyncHTTPClient。由于 "requests" 库是同步的,它会在执行期间阻塞 Tornado 事件循环,您一次只能处理一个请求。要使用 Tornado 执行异步网络操作,需要专门构建的异步网络代码,例如 CurlAsyncHTTPClient。

是的,CurlAsyncHTTPClient 比 AsyncHTTPClient 快一点,如果您使用它传输大量数据,您可能会注意到加速。

asyncawaitgen.coroutineyield 快,所以如果你有 yield 语句在紧密循环中执行得非常频繁,或者如果您有调用协程的深层嵌套协程,那么移植您的代码将是值得的。