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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/haeasringnar/article/details/100181680

同步执行的协程

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语法中使用,既它不是一个可等待对象

猜你喜欢

转载自blog.csdn.net/haeasringnar/article/details/100181680