如何基于response.headers动态设置asyncio异步请求的延迟?
背景
我使用asyncio异步发起API请求,因为响应体接收耗时较长,但我的订阅允许更快的请求速率。响应头Response.headers中的'time_reset'字段提供了下一次请求可成功的最早时间,早于该时间发起的新请求会返回429状态码(超出速率限制)
目标
- 无需等待前序请求结果,即可异步发起新请求
- 为每个请求设置动态延迟,确保新请求仅在当前time_reset时间之后发起(该值随每次请求更新)
问题
我已实现目标1(手动设置固定请求延迟时),但目标2未达成。当前的做法是:
- 设置全局变量
time_reset,可在发起新请求时即时获取/修改其值 - 循环创建任务以获取数据,在任务创建间隔中根据
time_reset的当前值await延迟 - 将任务存入列表,最后统一gather
但以下代码运行时,请求间似乎没有等待延迟。我不清楚原因及问题所在,应如何修改代码以实现上述目标?
代码
import asyncio import aiohttp import time async def fetch(url, headers): global time_reset async with aiohttp.ClientSession() as session: async with session.get(url, headers=headers) as response: time_reset = int(response.headers.get('time_reset')) # time when next request'd be successful/not exceeding rate limit if response.status_code==200: data = await response.json() else: data = None return data async def main(): global time_reset time_reset = 0 request_urls = <a list of urls to call> headers = <headers with renewed token> tasks = [] for url in request_urls: task = asyncio.create_task(fetch(url, headers)) tasks.append(task) current_time = int(time.time()) delay = max(0, time_reset - current_time + 0.5) # +0.5 to prevent lags await asyncio.sleep(delay) datas = await asyncio.gather(*tasks) await main() # running in jupyter notebook
相关说明
此前参考过类似问题的解决方案,但现有方案仅支持设置固定延迟,无法实现基于time_reset的动态更新。
内容的提问来源于stack exchange,提问作者iim7b5-v7-im7
相关产品推荐
相关产品推荐

