彻底搞清 同步,异步,阻塞,非阻塞的概念性知识

13

IO

需要先对 IO 的概念有一定的认识:

  • 我们通常使用php的fopen打开文件关闭文件读读写写, 这叫本地文件IO;
  • 而在socket编程中, 本质其实是网络IO;

同步异步阻塞非阻塞

之前反正一直搞不清楚同步和阻塞, 异步和非阻塞的概念, 总感觉同步就是阻塞, 异步就是非阻塞的, 总是搞得晕乎乎的, 于是就重新查了些资料进行了梳理, 如有不对欢迎大家指正;

简单来说

同步: 同步体现在, 在等待一件事情的处理结果时, 对方是否提供通知服务, 如果对方不提供通知服务, 则为 同步;

异步: 异步体现在, 在等待一件事情的处理结果时, 对方是否提供通知服务, 如果对方提供通知服务, 则为 异步;

  • 对于常见的Ajax请求, 前端在ajax请求后通常还会执行一些其他加载操作(非阻塞); 在server端处理完后, 会将数据'通知'到前端页面;
  • 而对于最近正好在看的RabbitMQ消息队列系统, 虽然本质上来说也是异步的(它是通过分隔了数据的发送和接收来解耦应用, 数据在最终被消费者处理完后也不会通知到生产者, 因为消息系统采用了很多手段如持久化, 重试等来确保消息一定会被执行), 但实质上, 消息会在发送成功后会立即得到响应, 所以单就生产者成功生产消息这一步来说, 其实是同步的;

阻塞: 阻塞体现在, 在等待一件事情的处理结果时, 你是否还去干点其他的事情, 如果不去, 则为 阻塞;

非阻塞: 非阻塞体现在, 在等待一件事情的处理结果时, 你是否还去干点其他的事情, 如果去了, 则为 非阻塞;

结合例子来说

此处找了一位朋友写的例子, 感觉很不错
同步阻塞: 你去 甜在心馒头 店买太极馒头, 阿梅说:"暂时没, 正在蒸呢, 你自己看着点儿!", 于是你就站在旁边只等馒头, 此时的你, 是阻塞的, 也是同步的;

  • 阻塞表现在你除了等馒头,别的什么都不做了;
  • 同步表现在等馒头的过程中, 阿梅不提供通知服务, 你不得不自己主动检查 "馒头出炉" 的消息;

同步非阻塞: 你去甜在心馒头店买太极馒头, 阿梅说:"暂时没, 正在蒸呢, 你自己看着点儿!", 于是你就站在旁边发发微信, 然后问一句:"好了没?", 然后玩玩QQ游戏, 然后再问一句:"好了没?", 此时的你, 是非阻塞的, 不过却还是同步的;

  • 非阻塞表现在你除了等馒头, 自己还在干别的事情;
  • 同步表现在等馒头的过程中, 由于阿梅不提供通知服务, 你不得不自己主动检查 "馒头出炉" 的消息;

异步阻塞: 你去甜在心馒头店买太极馒头, 阿梅说:"暂时没, 正在蒸呢, 蒸好了我打电话告诉你!", 但你依然站在旁边只等馒头, 此时的你, 是阻塞的, 是异步的;

  • 阻塞表现在你除了等馒头, 也没去干点别的什么(比如玩玩手机啥的);
  • 异步表现在等馒头的过程中, 阿梅提供电话通知"馒头出炉"的消息, 你只需要等阿梅的电话;

异步非阻塞: 你去甜在心馒头店买太极馒头, 阿梅说:"暂时没, 正在蒸呢, 蒸好了我打电话告诉你!", 于是你就走了, 去买了双新球鞋, 看了看武馆, 总之, 从此不再过问馒头的事情, 一心只等阿梅电话, 此时的你, 是非阻塞的, 是异步的

  • 非阻塞表现在你除了等馒头, 自己还去干点别的事情;
  • 异步表现在等馒头的过程中, 阿梅提供电话通知"馒头出炉"的消息, 你只需要等阿梅的电话;

你可能感兴趣的

beyondmars3 · 2018年12月21日

总感觉你这表述很牵强...

回复

0

我也感觉她这种说法,太牵强,尤其是异步和同步的说法

给力 · 5月26日
木鱼卓 · 3月25日

同步涉及到调用方和被调用方。 阻塞非阻塞仅涉及到调用方。虽然同步的例子认为有些牵强,但阻塞这块明白了一些。谢谢

回复

MarineJoker · 5月20日

逻辑清晰,至少比网上一堆瞎扯的强太多

回复

载入中...