完全搞清 同步,异步,阻塞,非阻塞的概念性知识

IO

须要先对 IO 的概念有必定的认识:php

  • 咱们一般使用php的fopen打开文件关闭文件读读写写, 这叫本地文件IO;
  • 而在socket编程中, 本质实际上是网络IO;

同步异步阻塞非阻塞

以前反正一直搞不清楚同步和阻塞, 异步和非阻塞的概念, 总感受同步就是阻塞, 异步就是非阻塞的, 老是搞得晕乎乎的, 因而就从新查了些资料进行了梳理, 若有不对欢迎你们指正;前端

简单来讲

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

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

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

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

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

结合例子来讲

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

  • 阻塞表如今你除了等馒头,别的什么都不作了;
  • 同步表如今等馒头的过程当中, 阿梅不提供通知服务, 你不得不本身主动检查 "馒头出炉" 的消息;

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

  • 非阻塞表如今你除了等馒头, 本身还在干别的事情;
  • 同步表如今等馒头的过程当中, 因为阿梅不提供通知服务, 你不得不本身主动检查 "馒头出炉" 的消息;

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

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

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

  • 非阻塞表如今你除了等馒头, 本身还去干点别的事情;
  • 异步表如今等馒头的过程当中, 阿梅提供电话通知"馒头出炉"的消息, 你只须要等阿梅的电话;
相关文章
相关标签/搜索