[英]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.