【问题标题】:Optimize Async Tornado code. Minimize the thread lock优化异步 Tornado 代码。最小化线程锁
【发布时间】:2016-12-01 20:30:24
【问题描述】:

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

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

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

所以,我正在发出几个同步请求(requests 库),然后使用 AsyncHttpClient 流式传输一个带有块的大文件。

问题如下:

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

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

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

【问题讨论】:

    标签: python multithreading asynchronous couchdb tornado


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-14
      • 1970-01-01
      • 2018-02-16
      • 2012-08-24
      • 1970-01-01
      相关资源
      最近更新 更多