【发布时间】:2018-11-28 14:28:42
【问题描述】:
我在 Python 3.5+ 中有一个模块,它提供了一个从远程 Web API 读取一些数据并返回它的函数。该函数依赖于一个包装函数,该函数又使用库 requests 进行 HTTP 调用。
在这里(故意省略所有数据验证逻辑和异常处理):
# module fetcher.py
import requests
# high-level module API
def read(some_params):
resp = requests.get('http://example.com', params=some_params)
return resp.json()
# wrapper for the actual remote API call
def get_data(some_params):
return call_web_api(some_params)
该模块当前被多个客户端导入和使用。
到目前为止,对 get_data 的调用本质上是同步的:这意味着使用函数fetcher.read() 的人都知道这将阻塞执行该函数的线程。
我希望实现的目标
我想允许fetcher.read() 以同步和异步方式同时运行(例如,通过事件循环)。
这是为了保持与使用模块的现有调用者的兼容性,同时提供可能性
利用非阻塞调用为想要异步调用函数的调用者提供更好的吞吐量。
这就是说,我的合法愿望是尽可能少地修改原始代码......
截至今天,我唯一知道的是 Requests 不支持开箱即用的异步操作,因此我应该切换到异步友好的 HTTP 客户端(例如aiohttp)以提供非阻止行为
需要如何修改上述代码以满足我的需求?这也让我问:有没有关于将同步软件 API 增强为异步上下文的最佳实践?强>
【问题讨论】:
标签: python asynchronous refactoring python-asyncio