学习异步协程过程中的小问题

代码如下
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有地方去注册


 

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值