[英]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
放在它前面是行不通的,因为它深深地嵌套在阻塞函数中。 重写所有内容会很麻烦。 我查看了aiohttp
, trio
, asks
并且有点迷路了,哪个更好。 我知道celery
或dask
,但我需要异步。
您有多种选择:
将_send_http_request
重写为异步(例如,使用aiohttp ),并进一步重写所有使用_send_http_request
为异步的函数。 是的,还有很多工作要做,但这就是asyncio
基本设计方式。
总结只有顶级闭锁功能(功能与I / O),你需要用异步运行run_in_executor作为解释在这里。 如果您不打算发出数百万个请求,您将看不到上述选项的性能差异,因为主要瓶颈仍然是 I/O。 否则与纯asyncio
解决方案相比,线程开销会很明显。
尝试其他解决方案而不是asyncio
。 例如, gevent和它的monkey-patching 。 这种方法有自己的优点和缺点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.