代码如下 import asyncio import time start=time.time() async def func(delay): print("开始执行...") await asyncio.sleep(delay) print("结束执行...") async def main(): tasks=[ asyncio.create_task((func(2))), asyncio.create_task((func(3))) ] await asyncio.wait(tasks) asyncio.run(main()) print(abs(time.time()-start))
若将任务对象放在协程函数中进行asyncio.create_task(func())可从而创建任务对象 并将任务对象注册到事件循环对象中
若不定义协程函数即直接
tasks=[
asyncio.create_task((func(2)))
asyncio.create_task((func(3)))
]
exe=await asyncio.wait(tasks)
asyncio.run(exe)
便会SyntaxError: 'await' outside function
因为此时tasks没在协程函数内 故并没注册到事件循环对象中去 await+ 可等待对象(协程对象、Future、Task-->I/O等待) 此时tasks不是可等待对象也不是协程对象
故await会报错
若你说 我不挂起 直接run不就行?
那我们来看看
RuntimeError: no running event loop
tasks这个任务对象没有注册到事件循环对象中 故没法调用run方法 进行事件循环的操作
又因为tasks没有挂起 更不能被挂起 因为不是一个协程对象 所以
sys:1: RuntimeWarning: coroutine 'func' was never awaited
协程永远没有被等待 故无法实现异步协程操作
故想将任务对象注册到事件循环对象中去 我们必须在协程函数内部创建任务对象 从而保证创建了一个事件循环 让task有地方去注册