1.概念:
同步IO:
CPU的速度远远快于磁盘、网络等 IO,一旦遇到 IO 操 作,如读写文件、发送网络数据时,就需要等待 IO 操作完成,才能继 续进行下一步操作。这种情况称为同步 IO。
IO操作时当前线程被挂起,其他需要CPU执行的代码无法执行。
为实现并发必须使用多线程/多进程或进行异步IO,
多线程/进程缺点如下:
- 系统不能无上限的增加线程(换句话说,缺点就是受系统资源限制),
- 系统切换开销随线程数增加而上升,切换占用时间增加,cpu执行时间减少,任务完成效率下降
异步IO:
“当代码需要执行一个耗时的 IO 操作时,它只发出 IO 指令,并不等待 IO 结果,然后就去执行其他代码 了。一段时间后,当 IO 返回结果时,再通知CPU进行处理。”
2. 实现
异步 IO 模型需要一个消息循环,在消息循环中,主线程不断地重复“读 取消息-处理消息”这一过程:
- 当遇到 IO 操作时,代码只负责发出 IO 请求,不等待 IO 结果,然后直接结束 本轮消息处理,进入下一轮消息处理过程。当 IO 操作完成后,将收到 一条“IO完成”的消息,处理该消息时就可以直接获取 IO 操作结果。
- 在“发出 IO 请求”到收到“IO完成”的这段时间里,
同步 IO 模型下,主线 程只能挂起,但异步 IO 模型下,主线程并没有休息,而是在消息循环 中继续处理其他消息。这
异步 IO 模型下,一个线程就可以同时 处理多个 IO 请求,并且没有切换线程的操作。对于大多数 IO 密集型的 应用程序,使用异步 IO 将大大提升系统的多任务处理能力。
3.协程/微线程/纤程 Coroutine
子程序
又称子函数,层级调用栈实现,一个线程执行一个子程序。一次调用,一次返回,调用顺序明确。
协程
类似子程序,区别如下:
- 协程执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行
- 由一个线程执行,不是线程切换
- 不需要多线程锁机制(因为只有一个线程,也不存在 同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好 了,所以执行效率比多线程高很多)
协程与多核CPU:多进程+协程
实现(Python)generator
EG:生产者消费者
4.asyncio
asyncio 是 Python 3.4 版本引入的标准库,直接内置了对异步 IO 的支持。
asyncio 的编程模型就是一个消息循环。
我们从 asyncio模块中直接获取 一个 EventLoop 的引用,然后把需要执行的协程扔到 EventLoop 中执行, 就实现了异步 IO。
EG:Hello World
简化标识异步IO:async 和 await 是针对 coroutine 的新语法
1. 把@asyncio.coroutine 替换为 async;
2. 把 yield from替换为 await。
5.aiohttp
asyncio 可以实现单线程并发 IO操作。如果仅用在客户端,发挥的威力 不大。如果把 asyncio 用在服务器端,例如Web 服务器,由于HTTP 连 接就是 IO 操作,因此可以用单线程+coroutine 实现多用户的高并发支 持。
asyncio 实现了TCP、UDP、SSL 等协议,aiohttp 则是基于 asyncio 实 现的HTTP 框架。