同步、异步、阻塞和非阻塞

最开始看到这四个名词的时候,感觉很困惑,这不都一样吗?后来就查了查。
最近又想起来这几个概念,发现记忆有些模糊,故写此博客。

1. 同步

调用者调用被调用者,当调用者没有获取到调用结果(被调用者正在处理,没有返回调用)时,调用者不执行后续操作。

同步的大致流程,调用者->被调用者->被调用者返回调用结果->调用者获取调用结果->调用者继续执行。

2. 异步

调用者调用被调用者,当调用者发起调用请求后,被调用者立即返回(此时被调用者继续执行调用处理,返回的不是调用结果),调用者执行后续操作。

异步的大致流程,调用者->被调用者->调用者获得调用返回,继续执行(同时,被调用者执行调用处理)->调用者获得调用结果.

从上述流程可以看出,调用者并不是在调用的时候获得调用结果,而是在后续的执行过程中才获取到调用结果。

通常调用者获取调用结果的方式有三种,如下
(1) 轮询
调用者发起调用请求后,轮询被调用者是否处理结束。处理结束获取调用处理结果,否则继续轮询。

(2) 通知
被调用者处理结束后通知调用者处理结果。例如,信号,linux系统中的sigin()。

(3) 回调
被调用者处理结束后,调用调用者提供的回调函数。

最后,可以发现同步和异步在描述调用的过程(流程),程序执行的顺序情况

3. 阻塞

调用者发起调用请求后,调用者挂起,等待调用执行结束后,获取调用结果,继续执行。

大致执行流程,调用者发起调用请求->调用者挂起->被调用者执行->被调用者执行结束->唤起调用者->调用者继续执行。

4. 非阻塞

调用者发起调用请求后,调用者继续执行其他任务,不挂起。在后续的某个时刻再获取调用结果。

大致执行流程,调用者发起调用请求->调用者继续执行其他任务(同时,被调用者执行调用处理)。

最后,可以发现阻塞和非阻塞主要描述调用过程中线程的状态

也可以理解为,同步和异步关注的是消息通知的机制,而阻塞和非阻塞关注的是线程等待消息通知时的状态。

posted @ 2022-08-23 18:25  韩亚光  阅读(23)  评论(0编辑  收藏  举报