繁体   English   中英

将具有阻塞请求的库重写为异步请求

[英]Rewrite a library with blocking requests into async ones

有一个库在其核心中使用阻塞requests ,我想将其重写为异步版本,所以请您建议最好/最简单的策略是什么。

整个库,经过几个嵌套函数,调用一个函数:

def _send_http_request(self, url, payload, method='post', **kwargs):
# type: (Text, Optional[Text], Text, dict) -> Response

response = request(method=method, url=url, data=payload, **kwargs)

return response

只是将async放在它前面是行不通的,因为它深深地嵌套在阻塞函数中。 重写所有内容会很麻烦。 我查看了aiohttptrioasks并且有点迷路了,哪个更好。 我知道celerydask ,但我需要异步。

您有多种选择:

  1. _send_http_request重写为异步(例如,使用aiohttp ),并进一步重写所有使用_send_http_request为异步的函数。 是的,还有很多工作要做,但这就是asyncio基本设计方式。

  2. 总结只有顶级闭锁功能(功能与I / O),你需要用异步运行run_in_executor作为解释在这里 如果您不打算发出数百万个请求,您将看不到上述选项的性能差异,因为主要瓶颈仍然是 I/O。 否则与纯asyncio解决方案相比,线程开销会很明显。

  3. 尝试其他解决方案而不是asyncio 例如, gevent和它的monkey-patching 这种方法有自己的优点和缺点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM