循环中多次调用异步函数,如何实现真正异步而非顺序执行?
解决异步函数并发执行问题
你的代码核心问题是每次循环都调用asyncio.run(main(tk)),这会启动独立的事件循环,导致三个请求顺序执行,完全没利用异步并发特性。
正确实现方式
把单个请求逻辑拆成独立函数,在顶层异步函数中创建所有任务,用asyncio.gather实现并发,同时复用aiohttp.ClientSession提升效率:
import asyncio import aiohttp import aiomoex import time tks = ['YNDX', 'TATN', 'GAZP'] # 单个请求的异步函数 async def fetch_data(session, tk): data = await aiomoex.get_board_candles(session=session, security=tk, interval=1, start='2023-08-01') print(data) return data # 顶层异步函数,管理并发任务 async def main(): async with aiohttp.ClientSession() as session: # 生成所有待执行的任务 tasks = [fetch_data(session, tk) for tk in tks] # 并发执行所有任务,等待全部完成并收集结果 results = await asyncio.gather(*tasks) return results if __name__ == "__main__": asyncio.run(main())
关键说明
- 复用
ClientSession:aiohttp推荐同一个会话处理多个请求,避免重复创建连接的开销 asyncio.gather(*tasks):将多个协程包装成一组任务,事件循环会同时调度它们执行,实现真正的异步并发- 仅调用一次
asyncio.run:确保所有任务在同一个事件循环中运行,这是异步并发的基础
内容的提问来源于stack exchange,提问作者dolbocluv
相关产品推荐
相关产品推荐

