彻底理解同步 异步 阻塞 非阻塞

https://www.cnblogs.com/loveer/p/11479249.html

 

1. 同步和异步

同步和异步描述的是消息通信机制

同步

当一个request发送出去以后,会得到一个response,这整个过程就是一个同步调用的过程。哪怕response为空,或者response的返回特别快,但是针对这一次请求而言就是一个同步的调用。

异步

当一个request发送出去以后,没有得到想要的response,而是通过后面的callback、状态或者通知的方式获得结果。可以这么理解,对于异步请求分两步:

1)调用方发送request没有返回对应的response(可能是一个空的response);

2)服务提供方将response处理完成以后通过callback的方式通知调用方。

对于1)而言是同步操作(调用方请求服务方),对于2)而言也是同步操作(服务方回掉调用方)。从请求的目的(调用方发送一个request,希望获得对应的response)来看,这两个步骤拆分开来没有任何意义,需要结合起来看,而这整个过程就是一次异步请求。异步请求有一个最典型的特点:需要callback、状态或者通知的方式来告知调用方结果。

 

2. 阻塞和非阻塞

阻塞和非阻塞描述的是程序在等待调用结果时的状态

阻塞

阻塞调用是指调用方发出request的线程因为某种原因(如:等待系统资源)被服务方挂起,当服务方得到response后就唤醒挂起线程,并将response返回给调用方。

非阻塞

非阻塞调用是指调用方发出request的线程在没有等到结果时不会被挂起,直到得到response后才返回。

阻塞和非阻塞最大的区别就是看调用方线程是否会被挂起。

 

同步阻塞方式:

   发送方发送请求之后一直等待响应。

   接收方处理请求时进行的IO操作如果不能马上等到返回结果,就一直等到返回结果后,才响应发送方,期间不能进行其他工作。

 

同步非阻塞方式:

   发送方发送请求之后,一直等待响应。

  接受方处理请求时进行的IO操作如果不能马上的得到结果,就立即返回,取做其他事情。

  但是由于没有得到请求处理结果,不响应发送方,发送方一直等待。

  当IO操作完成以后,将完成状态和结果通知接收方,接收方再响应发送方,发送方才进入下一次请求过程。(实际不应用)

 

异步阻塞方式:

   发送方向接收方请求后,不等待响应,可以继续其他工作。

   接收方处理请求时进行IO操作如果不能马上得到结果,就一直等到返回结果后,才响应发送方,期间不能进行其他操作。 (实际不应用)

 

异步非阻塞方式:

   发送方向接收方请求后,不等待响应,可以继续其他工作。

   接收方处理请求时进行IO操作如果不能马上得到结果,也不等待,而是马上返回去做其他事情。

   当IO操作完成以后,将完成状态和结果通知接收方,接收方再响应发送方。(效率最高)

posted @ 2021-10-18 17:46  骑着蜗牛去救你  阅读(57)  评论(0编辑  收藏  举报