廖雪峰python学习笔记【21】异步IO

一、异步IO

  1. CPU的运行速度远大于磁盘,网络等IO操作。

  2. 同步IO:CPU发出IO请求,等待IO处理完成,继续进行其他处理。

  3. 异步IO:CPU发出IO请求,不等待IO处理结果,继续进行其他处理;当IO处理完成通知CPU时,CPU再去处理IO结果。

  4. 解决同步IO的问题,还可以使用多进程和多线程模型。此时会额外带来线程切换的开销。

二、协程(coroutine)

  1. 协程有点类似于CPU的中断。

  2. 和多线程相比,协程的优势:

    1. 协程在一个线程中执行,没有线程切换的开销。

    2. 不需要锁机制。因为在同一个线程中,不会存在写冲突。

  3. python对协程的支持是通过generator实现的。

  4. 协程相关的方法:

    1. 首先需要通过co.send(NULL)或next(co),启动协程,将协程运行到yield语句处。

    2. 通过co.send(msg),切换到协程,在yield语句处继续执行。

    3. 协程的yield语句,既能够接收消息(通过co.send(msg)发送过来的消息),也能够返回消息。

    4. 通过co.close()能够关闭协程。

三、asyncio

  1. asyncio是python3.4版本引入的标准库,内置了对异步IO的支持。

  2. asyncio与协程(coroutine)

    1. 首先通过asyncio提供的@asyncio.coroutine将一个generator标记为coroutine类型;

    2. 然后在coroutine内部用yield from调用另一个coroutine实现异步操作。

  3. asyncio的编程模型:

    1. asyncio的编程模型是一个消息循环;

    2. 首先从asyncio模块获取一个EventLoop的引用;

    3. 然后把需要执行的协程扔到EventLoop中,就实现了异步IO。

  4. yield from:

    1. 该语句可以让我们方便的调用另一个generator。

    2. 异步操作需要在coroutine中通过yield from完成。

  5. 示例代码:

import asyncio

@asyncio.coroutine
def hello():
    print("Hello, world!")
    r = yield from asyncio.sleep(1)
    print("Hello again!")

loop = asyncio.get_event_loop()
loop.run_until_complete( hello() )
loop.close()

四、async/await

  1. python3.5版本引入async和await。

  2. async/await与asyncio的关系:

    1. @asyncio.coroutine等价于async;

    2. yield from等价于await。

  3. 示例代码:

    import asyncio

    async def hello():
        print("Hello, world!")
        r = await asyncio.sleep(1)
        print("Hello again!")

    loop = asyncio.get_event_loop()
    loop.run_until_complete( hello() )
    loop.close()

五、aiohttp

  1. asyncio实现了TCP, UDP, SSL等协议。

  2. aiohttp则是基于asyncio实现的http框架!。使用前安装pip install aiohttp。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值