Python3.7 高级编程之 async/await asyncio 通过任务task并发运行协程

同步执行的协程
import asyncio
import time

# 使用 main 函数的await 发起两个携程,此时代码仍然是同步的,当第一个await 完成之后 才会启动第二个await 这是他们的运行就和函数是一致的
async def say_after(delay, what):
    await asyncio.sleep(delay)
    print(what)

async def main():
    print(f"started at {time.strftime('%X')}")

    await say_after(1, 'hello')
    await say_after(2, 'world')

    print(f"finished at {time.strftime('%X')}")

asyncio.run(main())
并发执行的协程
import asyncio
import time

# 与上一个例子不同的是:这里启动协程 是通过启动 task 任务的方式,这个任务被认为是可等待的对象,因此它们可以并发的运行,本例将比上例节省一秒钟
async def say_after(delay, what):
    await asyncio.sleep(delay) # 为什么要使用这种方式来模拟等待?因为 time.sleep(delay) 不被asyncio认为是可等待对象,所以当替换为 time.sleep() 将不会出现预期的
    # time.sleep(delay)
    print(what)

async def main():
    print(f"started at {time.strftime('%X')}")

    # 用于创建协程任务
    task1 = asyncio.create_task(say_after(1,'hello'))
    task2 = asyncio.create_task(say_after(2,'world'))

    # 并发启动任务 虽然并发的执行了,但在Python中 程序会等待最耗时的协程运行完毕后退出,所以这里耗时2秒
    await task1
    await task2
    print(f"finished at {time.strftime('%X')}")

asyncio.run(main())

asyncio.sleep(delay) 是用来模拟阻塞行为的,可以把它看做是一个耗时任务,它会返回一个可等待对象
time.sleep(delay)虽然可以模拟一个耗时操作,但是它并不能在await语法中使用,既它不是一个可等待对象

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

haeasringnar

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值