优化异步龙卷风代码。最小化线程锁定

时间:2016-12-01 20:30:25

标签: python multithreading asynchronous couchdb tornado

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

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

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

因此,我正在制作多个同步请求(requests库),然后使用AsyncHttpClient的块来流式传输大型文件。

问题如下:

1)我应该在任何地方使用AsyncHTTPClient吗?由于我有一些接口,因此需要花费大量时间用异步请求替换所有同步请求。值得这样做吗?

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

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

1 个答案:

答案 0 :(得分:2)

使用AsyncHTTPClient或CurlAsyncHTTPClient。由于“请求”库是同步的,因此它会在执行期间阻止Tornado事件循环,并且一次只能有一个请求正在进行中。使用Tornado进行异步网络操作需要专用的异步网络代码,如CurlAsyncHTTPClient。

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

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