IO
需要先对 IO
的概念有一定的认识:
- 我们通常使用php的fopen打开文件关闭文件读读写写, 这叫
本地文件IO
; - 而在socket编程中, 本质其实是
网络IO
;
同步异步阻塞非阻塞
之前反正一直搞不清楚同步和阻塞, 异步和非阻塞的概念, 总感觉同步就是阻塞, 异步就是非阻塞的, 总是搞得晕乎乎的, 于是就重新查了些资料进行了梳理, 如有不对欢迎大家指正;
简单来说
同步: 同步体现在, 在等待一件事情的处理结果时, 对方是否提供通知服务, 如果对方不提供通知服务, 则为 同步;
异步: 异步体现在, 在等待一件事情的处理结果时, 对方是否提供通知服务, 如果对方提供通知服务, 则为 异步;
- 对于常见的Ajax请求, 前端在ajax请求后通常还会执行一些其他加载操作(非阻塞); 在server端处理完后, 会将数据'通知'到前端页面;
- 而对于最近正好在看的RabbitMQ消息队列系统, 虽然本质上来说也是异步的(它是通过分隔了数据的发送和接收来解耦应用, 数据在最终被消费者处理完后也不会通知到生产者, 因为消息系统采用了很多手段如持久化, 重试等来确保消息一定会被执行), 但实质上, 消息会在发送成功后会立即得到响应, 所以单就生产者成功生产消息这一步来说, 其实是同步的;
阻塞: 阻塞体现在, 在等待一件事情的处理结果时, 你是否还去干点其他的事情, 如果不去, 则为 阻塞;
非阻塞: 非阻塞体现在, 在等待一件事情的处理结果时, 你是否还去干点其他的事情, 如果去了, 则为 非阻塞;
结合例子来说
此处找了一位朋友写的例子, 感觉很不错
同步阻塞: 你去 甜在心馒头 店买太极馒头, 阿梅说:"暂时没, 正在蒸呢, 你自己看着点儿!", 于是你就站在旁边只等馒头, 此时的你, 是阻塞的, 也是同步的;
- 阻塞表现在你除了等馒头,别的什么都不做了;
- 同步表现在等馒头的过程中, 阿梅不提供通知服务, 你不得不自己主动检查 "馒头出炉" 的消息;
同步非阻塞: 你去甜在心馒头店买太极馒头, 阿梅说:"暂时没, 正在蒸呢, 你自己看着点儿!", 于是你就站在旁边发发微信, 然后问一句:"好了没?", 然后玩玩QQ游戏, 然后再问一句:"好了没?", 此时的你, 是非阻塞的, 不过却还是同步的;
- 非阻塞表现在你除了等馒头, 自己还在干别的事情;
- 同步表现在等馒头的过程中, 由于阿梅不提供通知服务, 你不得不自己主动检查 "馒头出炉" 的消息;
异步阻塞: 你去甜在心馒头店买太极馒头, 阿梅说:"暂时没, 正在蒸呢, 蒸好了我打电话告诉你!", 但你依然站在旁边只等馒头, 此时的你, 是阻塞的, 是异步的;
- 阻塞表现在你除了等馒头, 也没去干点别的什么(比如玩玩手机啥的);
- 异步表现在等馒头的过程中, 阿梅提供电话通知"馒头出炉"的消息, 你只需要等阿梅的电话;
异步非阻塞: 你去甜在心馒头店买太极馒头, 阿梅说:"暂时没, 正在蒸呢, 蒸好了我打电话告诉你!", 于是你就走了, 去买了双新球鞋, 看了看武馆, 总之, 从此不再过问馒头的事情, 一心只等阿梅电话, 此时的你, 是非阻塞的, 是异步的
- 非阻塞表现在你除了等馒头, 自己还去干点别的事情;
- 异步表现在等馒头的过程中, 阿梅提供电话通知"馒头出炉"的消息, 你只需要等阿梅的电话;
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。