python 异步 I/O

若是你想了解异步编程,那么必然会涉及出许多相关概念。html

  • 堵塞/非堵塞
  • 同步/异步
  • 多进程/多线程/协程

为何我要学习这个话,由于我想搞懂异步框架和异步接口的调用。因此,个人学习路线是这样的:python

1.python异步编程
2.python Web异步框架(tornado/sanic)
3.异步接口调用(aiohttp/httpx)编程

那么异步编程有什么好处?在某些场景下它能够提升性能。咱们知道CPU的速度快于磁盘、网络等IO。一旦遇到IO操做,如读写文件、发送网络数据时,就须要等待IO操做完成,才能进行下一步操做。这种状况称为同步IO。咱们可使用多线程来解决这类问题,另外一种方式是经过异步。网络

python在3.4版本引入asyncio,到 3.5版本又加入async/await来简化异步的使用。多线程

先来举个简单的例子,假如,你和女友逛街。你的目的是去看新上市的华为P40手机,而你女友是去看新款的衣服。大家的逛街流程是这样的。并发

import time


def clothes_shop():
    print("女友看衣服..")
    time.sleep(8)
    print("...出来了")


def huawei_shop():
    print("体验手机..")
    time.sleep(5)
    print("...出来了")

print(time.ctime(), "开始逛街")
clothes_shop()
huawei_shop()
print(time.ctime(), "结束.")

运行结果:框架

Thu Apr 16 00:08:22 2020 开始逛街
女友看衣服..
...出来了
体验手机..
...出来了
Thu Apr 16 00:08:35 2020 结束.

假设单位是分钟,大家总共耗时13分钟。异步

接下来,看看用异步是如何处理的:async

import asyncio
import time


async def shop(delay, what):
    print(what)
    await asyncio.sleep(delay)
    print("...出来了")


async def main():
    task1 = asyncio.create_task(shop(8, '女友看衣服..'))
    task2 = asyncio.create_task(shop(5, '体验手机..'))

    print(time.ctime(), "开始逛街")
    await task1
    await task2
    print(time.ctime(), "结束.")


asyncio.run(main())

经过 async/await 语法进行声明,是编写 asyncio 应用的推荐方式。异步编程

  • async 声明一个函数为异步函数。
  • await 声明处理比较耗费时的动做。
  • asyncio.run() 函数用来运行最高层级的入口点 main() 函数。
  • asyncio.create_task() 函数用来并发运行做为 asyncio 任务 的多个协程。

其实,思路很是简单,就是你和女友各逛各自的,先出来的等等对方。

严重警告!提醒广大直男,现实生活中千万不要这么思考问题。必定要陪女友一块儿看衣服,还要主动去付钱。

来看看运行结果:

Thu Apr 16 00:19:19 2020 开始逛街
女友看衣服..
体验手机..
...出来了
...出来了
Thu Apr 16 00:19:27 2020 结束.

假设单位是分钟,只须要8分钟搞定。

经过上面的例子,能够看到 task一、task2仍然有先后顺序,这种先后顺序的时间能够忽略不计。可是,咱们也是可使用asyncio.gather()方法并发运行任务。

#……

async def main():
    print(time.ctime(), "开始逛街")
    await asyncio.gather(
        shop(8, '女友看衣服..'),
        shop(5, '体验手机..')
    )
    print(time.ctime(), "结束.")

asyncio.run(main())

运行结果同上,这里就再也不贴了。

参考:https://docs.python.org/zh-cn/3/library/asyncio.html

相关文章
相关标签/搜索