优化异步 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 快一点,如果您使用它传输大量数据,您可能会注意到加速。
async
和 await
比 gen.coroutine
和 yield
快,所以如果你有 yield
语句在紧密循环中执行得非常频繁,或者如果您有调用协程的深层嵌套协程,那么移植您的代码将是值得的。
如何使用 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 快一点,如果您使用它传输大量数据,您可能会注意到加速。
async
和 await
比 gen.coroutine
和 yield
快,所以如果你有 yield
语句在紧密循环中执行得非常频繁,或者如果您有调用协程的深层嵌套协程,那么移植您的代码将是值得的。