zoukankan      html  css  js  c++  java
  • python之asyncio

    asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持。

    asnycio是用来编写并发代码的库,python3.5以后使用async/await语法。

    asyncio 被用作多个提供高性能 Python 异步框架的基础,包括网络和网站服务,数据库连接库,分布式任务队列等等。

    asyncio 往往是构建 IO 密集型和高层级 结构化 网络代码的最佳选择。

    asyncio 提供一组 高层级 API 用于:

    • 并发地 运行 Python 协程 并对其执行过程实现完全控制;
    • 执行 网络 IO 和 IPC;
    • 控制 子进程;
    • 通过 队列 实现分布式任务;
    • 同步 并发代码;

    此外,还有一些 低层级 API 以支持 库和框架的开发者 实现:

    • 创建和管理 事件循环,以提供异步 API 用于 网络化, 运行 子进程,处理 OS 信号 等等;
    • 使用 transports 实现高效率协议;
    • 通过 async/await 语法 桥接 基于回调的库和代码。

    利用asyncio实现hello world协程                                                   

    python3.4

    import asyncio
    
    @asyncio.coroutine
    def hello():
        print("Hello!---")
        # 异步调用asyncio.sleep(1):
        r = yield from asyncio.sleep(1)
        print("---World!")
    
    # 获取EventLoop:
    loop = asyncio.get_event_loop()
    # 执行coroutine
    loop.run_until_complete(hello())
    loop.close()

    @asyncio.coroutine会把一个generator(生成器)标记为coroutine(协程)类型,然后我们就把这个coroutine扔到eventloop(事件循环)中去。

     hello()首先会打印出'Hello!----',然后yeild from语法可以让我们更方便的调用另一个generator。由于asyncio.sleep(1)也是一个coroutine,所有线程不会等待asyncio,.sleep(1),而是直接中断并执行下一个消息循环了。当asyncio返回时,线程就可以从yield from拿到返回值(此处是None)并执行下一句语句。

    把asyncio看作是一个耗时1s的I/O操作,在此期间主线程并未等待,而是去执行event_loop中其他可以执行的coroutine了,因此可以实现并发执行。

    python 3.5

    asyncio提供的@asyncio.coroutine可以把一个generator标记为coroutine类型,然后在coroutine内部用yield from调用另一个coroutine实现异步操作。

    为了简化并更好地标识异步IO,从Python 3.5开始引入了新的语法asyncawait,可以让coroutine的代码更简洁易读。

    请注意,asyncawait是针对coroutine的新语法,要使用新的语法,只需要做两步简单的替换:

    1. @asyncio.coroutine替换为async
    2. yield from替换为await

    那么上述代码可以简化为:

    import asyncio
    
    async def hello():
        print("Hello!---")
        # 异步调用asyncio.sleep(1):
        await asyncio.sleep(1)
        print("---World!")
    
    # 获取EventLoop:
    loop = asyncio.get_event_loop()
    # 执行coroutine
    loop.run_until_complete(hello())
    loop.close()

    python 3.7

    新增了asyncio.run() api来执行异步函数

    上述代码可以改为:

    import asyncio
    
    async def hello():
        print("Hello!---")
        # 异步调用asyncio.sleep(1):
        await asyncio.sleep(1)
        print("---World!")
    
    asyncio.run(hello())
  • 相关阅读:
    结对-四则运算-最终程序
    结对- 四则运算器-结对项目总结
    课后作业-阅读任务-阅读提问-3
    课后作业-现代软件工程-阅读笔记
    软件工程课程总结
    团队-学生成绩管理一阶段互评
    结对-英文词频检测程序-测试过程
    团队-学生成绩管理-项目进度
    团队-学生成绩管理-模块开发过程
    eclipse下的文件路径问题
  • 原文地址:https://www.cnblogs.com/xiaozx/p/10636186.html
Copyright © 2011-2022 走看看