簡體   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