如何使用Tornado
最小化线程锁定?实际上,我已经有了工作代码,但我怀疑它并非完全异步。
我的任务很长。
它包括向CouchDB
发出多个请求以获取元数据并构建最终链接。然后我需要向CouchDB
发送最后一个请求并流式传输一个文件(从10 MB到100 MB)。因此,结果将是将大文件流式传输到客户端。
服务器可以同时接收100个下载大文件的请求的问题,我不需要锁定线程并继续接收新请求(我必须最小化线程锁定)。
因此,我正在制作多个同步请求(requests
库),然后使用AsyncHttpClient
的块来流式传输大型文件。
问题如下:
1)我应该在任何地方使用AsyncHTTPClient
吗?由于我有一些接口,因此需要花费大量时间用异步请求替换所有同步请求。值得这样做吗?
2)我应该使用tornado.curl_httpclient.CurlAsyncHTTPClient
吗?代码运行得更快(文件下载,发出请求)吗?
3)我看到Python 3.5
引入了async
,理论上它可以更快。我应该使用异步还是继续使用装饰器@gen.coroutine
?
答案 0 :(得分:2)
使用AsyncHTTPClient或CurlAsyncHTTPClient。由于“请求”库是同步的,因此它会在执行期间阻止Tornado事件循环,并且一次只能有一个请求正在进行中。使用Tornado进行异步网络操作需要专用的异步网络代码,如CurlAsyncHTTPClient。
是的,CurlAsyncHTTPClient比AsyncHTTPClient快一点,如果你用它传输大量数据,你可能会注意到加速。
async
和await
比gen.coroutine
和yield
快,所以如果你有yield
语句在紧密循环中频繁执行,或者如果你有深度嵌套的协同程序调用协同程序,那么移植代码是值得的。