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

Python 3.6中aiohttp async GET请求同步执行问题排查求助

解决异步请求串行执行的问题

嘿,你猜的完全没错!问题大概率出在for record in records的循环写法上——如果你的代码是在循环里逐个await每个请求,那本质上就是串行执行,根本没用到异步的并发能力。咱们来一步步修正:

1. 先看你可能踩的坑:循环里直接await导致串行

如果你的主函数是类似下面这样,那每个请求都会等上一个完成才会发起,完全是同步逻辑:

async def main():
    records = get_records()  # 你的记录列表
    for record in records:
        # 每次循环都等待当前请求完成才进入下一次
        await send_request(record)

2. 正确的异步并发写法:用asyncio.gather批量执行

要实现真正的异步并发,你需要先把所有异步任务收集起来,再一次性交给事件循环并行处理:

import asyncio
import aiohttp  # 确保用的是异步HTTP库,别用requests这种同步的!

# 你的请求函数,必须是真正的异步实现
async def send_request(record):
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://your-api-endpoint.com",
            json={"data": record}
        ) as resp:
            return await resp.json()

async def main():
    records = get_records()
    
    # 第一步:把所有任务打包成列表(这里只是创建任务对象,还没执行)
    tasks = [send_request(record) for record in records]
    
    # 第二步:用gather并发执行所有任务,等待全部完成后获取结果
    results = await asyncio.gather(*tasks)
    
    # 处理返回结果,results的顺序和tasks的顺序一一对应
    for record, result in zip(records, results):
        print(f"Record {record['id']} result: {result}")

if __name__ == "__main__":
    asyncio.run(main())

这里的关键是:asyncio.gather(*tasks)会同时启动所有任务,而不是逐个等待,真正利用了异步IO的并发优势。

3. 其他可能导致“假异步”的坑

如果改了循环写法还是不行,得检查这几点:

  • 是不是用了同步库:比如你在send_request里用了requests而不是aiohttp,哪怕套了async def,同步IO操作会直接阻塞事件循环,导致所有任务串行执行。
  • 有没有限制并发的意外逻辑:比如代码里不小心加了全局锁,或者用了time.sleep()(异步里要用await asyncio.sleep())。
  • 任务量太大?加个信号量限流:如果records数量特别多,一次性发起几百上千个请求可能会被服务器限流,这时候可以用asyncio.Semaphore控制并发数:
async def send_request(record, semaphore):
    async with semaphore:  # 每次只有指定数量的任务能进入这个代码块
        async with aiohttp.ClientSession() as session:
            # 你的请求逻辑...

async def main():
    records = get_records()
    semaphore = asyncio.Semaphore(15)  # 限制同时最多15个请求
    tasks = [send_request(record, semaphore) for record in records]
    results = await asyncio.gather(*tasks)

内容的提问来源于stack exchange,提问作者metersk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:21:56