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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 20:35:15