同步&异步 阻塞&非阻塞个人理解

222 阅读4分钟

image.png image.png image.png

同步&异步

同步&异步:说的其实是调用方和被调用方双方的联动的动作,调用方和被调用方之间的联合动作(比如请求)可以说是同步或异步的。比如调用方(A)调用被调用方(B),调用方A轮询的访问被调用方B希望获取是否处理完成的答复,此时调用方A和被调用方B是同步的,注意这里的用词,A调用B的请求是同步的,所以我说同步&异步这个概念是一个双方的概念。同理,调用方A调用被调用方B后,被调用方B立即返回,在被调用方B处理数据的这段时间内,调用方A可以干其他的事情,等被调用方B操作完成后,可以选择通知调用方A,当然这属于回调的概念,不多赘述,此时他们双方处于异步状态,所以这次请求可以叫做异步请求。 PS:你有听说过阻塞请求吗?

阻塞&非阻塞

阻塞&非阻塞:一般说的是调用方,表示调用方A在调用到被调用方B之后是继续等待还是可以空出手来做其他事情。比如调用方A在调用被调用方B之后,没有返回,等待被调用方B处理完毕后,返回结果,此时调用方A处于阻塞状态,这里只说的是调用方A,因为被调用方B在做该做的事情,但是调用方A在阻塞(傻傻的等)。同理调用方A在调用了被调用方B之后,被调用方B立即返回了,此时调用方A可以去做其他事情,它就是非阻塞的,它不用阻塞(傻傻的等)。

结合同步&异步 和 阻塞&非阻塞

结合同步&异步 和 阻塞&非阻塞 : 可以说,同步&异步是一个相对的概念,调用方A调用被调用方B ,如果A调用B,B立即返回了,那A相对于B就是异步的,否则等B执行完了,才返回A,就是同步的。 1、在异步的情况下如果没有回调方法,一般来讲,业务中的A会定期循环访问B获取任务的执行状态,但是在定期之外的其他时间,A是可以干其他事情的,即使调用方此时不能叫做异步,但是可以称之为非阻塞。 2、在异步的情况下如果有回调方法,那A第一次调用B之后,B返回,A没有阻塞,不需要关心B的执行情况,等B任务执行完成后,会回调某个方法,以回调的这种方式完成异步的终极目标 — 任务扔出去就不需要关心了。当然有回调的异步请求,调用方一定是非阻塞的。

区分 同步阻塞、同步非阻塞、异步阻塞、异步非阻塞

💡 区分 同步阻塞、同步非阻塞、异步阻塞、异步非阻塞 : 来源:blog.csdn.net/qq_36963372…

  • 看使用场景的。简单点来说,同步就是串行顺序执行;异步就是并行,不再等待返回结果。
  • 比如单进程的脚本程序,主进程只有在上一个函数执行完毕才能执行下一个函数(串行),这就是同步阻塞状态。
  • 当主进程执行到某个函数的时候,开启了一条线程,要执行的程序丢到线程内执行,那么主进程就能继续往下执行;主进程会等待这个线程执行结束后才会关闭(主进程会去获取线程的执行情况,同步非阻塞)。
  • 当主进程执行某个函数的时候,发现这是一个需要执行10秒钟才会有返回值的异步函数1(这时候是无法立即获取函数返回值的),但是我偏偏就用一个同步的函数来使用这个异步函数1的返回值,那么就会进入阻塞状态(异步阻塞),失去了异步的意义。
  • 如果我写了一个异步函数2,等待异步函数1返回结果的时候触发它,主进程继续执行别的函数,回调(异步非阻塞)。

例外情况解释:异步状态下,主进程不需要等待异步函数返回结果。异步函数使用异步方式调用那就是完整的异步非阻塞;

异步函数使用同步方式调用比如同步函数调用异步函数就可能会产生异步阻塞的情况(异步函数被当成同步函数来使用了)。