2022-08-21 async与await创建协程

1. 协程的概念

协程可以理解为线程的微线程,每个协程对应一个可执行函数。
具体解释可见(14条消息) Python 异步 async/await(进阶)_零否的博客-CSDN博客_async await python

2. 协程在python中的实现

协程的实现在python3中可以利用async模块。
具体代码如下:

import asyncio # 导入 asyncio库
def xiechengTest():
    # 第一步,创建协程(异步函数)
    async def fun1(): # 异步函数相较普通函数定义前面多了async
        await asyncio.sleep(3) # 通过await声明一个可等待对象,比如异步函数或awaitable类的实例
        print("fun1执行完毕")

    async def fun2():
        await asyncio.sleep(1)
        print("fun2执行完毕")

    # 第二步,建立事件循环,建立事件循环包含以下几步
    # 1. 创建一个事件循环
    loop = asyncio.get_event_loop()
    # 2. 将异步函数加入事件队列
    tasks = [
        fun1(),
        fun2(),
    ]
    # 3. 执行事件队列, 直到最晚的一个事件被处理完毕后结束
    loop.run_until_complete(asyncio.wait(tasks))
    # 4. 用 close() 方法关闭事件循环, 以彻底清理 loop 对象防止误用
    loop.close()

if __name__ == "__main__":
    xiechengTest()

3. 创建协程的好处

最直观的优点就是充分利用CPU,节省程序运行时间。在上面主程序中稍作修改,可以计算出该程序的运行时间:

if __name__ == "__main__":
    import time
    start = time.time()
    xiechengTest()
    end = time.time()
    print(f"程序运行时间为{end - start}")

运行结果如下:

>>> fun2执行完毕
>>> fun1执行完毕
>>> 程序运行时间为3.0134615898132324

可以看到整个程序运行时间仅比单独执行fun1()函数的时间多了一点点,这说明fun2()执行时fun()1也在同步执行,多出来的那点时间是线程切换导致的。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容