如何在同步函数的循环中正确调用异步函数?
问题原因
你现在的核心问题是:每次调用async_function()只是生成了一个协程对象,但并没有真正调度它执行——协程必须通过await关键字,或者交给异步事件循环处理才会运行,所以才会抛出RuntimeWarning: coroutine 'async_function' was never awaited警告,函数内的逻辑自然也不会执行。
解决方案
根据你的执行需求,有两种常见处理方式:
方式1:顺序执行100个异步任务
如果需要这100次调用按顺序执行,把同步函数改成异步函数,在循环内逐个await协程,最后用asyncio.run()启动整个异步流程:
import asyncio async def async_function(): await some_function() async def async_sync_function(): for i in range(100): await async_function() # 启动异步逻辑 asyncio.run(async_sync_function())
方式2:并发执行100个异步任务(推荐,效率更高)
如果这100个任务之间没有依赖关系,用asyncio.gather()批量提交协程,让它们并发运行:
import asyncio async def async_function(): await some_function() async def async_sync_function(): # 批量创建100个协程对象 tasks = [async_function() for _ in range(100)] # 并发执行所有任务 await asyncio.gather(*tasks) asyncio.run(async_sync_function())
可选:保留同步函数的写法
如果一定要让sync_function保持同步,可以在内部手动创建并运行事件循环:
import asyncio async def async_function(): await some_function() def sync_function(): loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) # 这里可以选择顺序执行或并发执行,示例用并发 tasks = [async_function() for _ in range(100)] loop.run_until_complete(asyncio.gather(*tasks)) loop.close() sync_function()
内容的提问来源于stack exchange,提问作者Nakeuh
相关产品推荐
相关产品推荐

