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

为何要在asyncio.run()中调用异步函数?

Python异步函数为何要在asyncio.run()中调用执行?

先看官方给出的这段示例代码:

import asyncio

async def main():
    print('Hello ...')
    await asyncio.sleep(1)
    print('... World!')

asyncio.run(main())

很多人会困惑:为什么asyncio.run()里要写main()而不是直接传main?毕竟在JavaScript里,我们是像document.addEventListener('click', someFunction)这样,传递函数本身而非执行结果。

核心原因:Python异步函数调用后返回协程对象

Python里定义的async函数,和普通函数不一样——调用它(比如main())并不会立即执行函数体里的代码,而是返回一个协程对象(Coroutine Object),这才是asyncio.run()、asyncio.gather()这类asyncio API真正需要的参数。

举个直观的例子验证:

async def foo():
    pass

coro = foo()
print(type(coro))  # 输出:<class 'coroutine'>

和JavaScript的差异对比

JavaScript里的事件回调场景,我们传函数本身是因为事件触发时,浏览器会自动去执行这个函数;但asyncio.run()的作用是启动事件循环并调度执行指定的协程,它需要的是已经创建好的协程实例,而不是async函数本身。

如果直接把main(函数对象)传给asyncio.run(),会直接报错,因为它的参数类型要求是协程对象,不是可调用的async函数。

扩展到asyncio.gather()

asyncio.gather()的逻辑完全一致:它需要接收多个协程对象来并发执行,所以你会看到类似asyncio.gather(coro_task1(), coro_task2())的写法——每一个coro_task()调用都是在生成协程对象,供gather调度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 05:27:04