You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 10:25:07