为何要在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
相关产品推荐
相关产品推荐

