Python:异步方法调用含异步逻辑的非异步方法报错求助
问题解决:异步方法中调用含异步逻辑的非异步函数
错误原因
你遇到的RuntimeError是因为asyncio.run()会创建新的事件循环,但当你在asn2(已处于asyncio.run(asn2())启动的循环中)调用sn()时,sn()里的asyncio.run(asn1())试图再创建一个新循环,同一线程不允许同时运行多个事件循环,因此报错。附带的coroutine 'asn1' was never awaited是这个错误引发的次生警告。
解决方案
情况1:无需等待异步函数执行完成
保持sn为非异步函数,直接获取当前运行的事件循环提交异步任务:
import asyncio async def asn1(): print("asn1") def sn(): # 获取当前正在运行的事件循环 loop = asyncio.get_running_loop() # 将协程提交到事件循环调度执行 loop.create_task(asn1()) async def asn2(): sn() asyncio.run(asn2())
情况2:需要等待异步函数执行完成
如果必须在sn中等待asn1执行完毕,建议将sn改为异步函数(这是更符合asyncio设计的方式):
import asyncio async def asn1(): print("asn1") async def sn(): # 直接await异步函数 await asn1() async def asn2(): await sn() asyncio.run(asn2())
如果强制要保持sn为非异步函数,可使用run_coroutine_threadsafe(但会阻塞当前线程,不推荐在异步上下文频繁使用):
import asyncio async def asn1(): print("asn1") return "done" def sn(): loop = asyncio.get_running_loop() # 提交协程并等待结果,会阻塞当前线程 future = asyncio.run_coroutine_threadsafe(asn1(), loop) result = future.result() print(result) async def asn2(): sn() asyncio.run(asn2())
内容的提问来源于stack exchange,提问作者Jyotiprakash panigrahi
相关产品推荐
相关产品推荐

