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


转载链接:https://www.zhihu.com/question/267866765/answer/507642794

同步不同步,阻塞不阻塞,这两个概念是互相独立的(orthogonal),也就是说他们一共可以搞出来四种情况:

  1. 同步+阻塞:程序代码一行一行执行,上一行不执行完,下一行就不会被执行;如果上一行卡住了迟迟不结束(阻塞了),那么整块代码全部卡住。遇到这种代码的感觉就是程序突然卡住死机,小圈圈来回转,此时用户无法区分电脑是在冥想还是挂了,所以体验非常差。
  2. 同步+非阻塞:这就是最常见的程序,一行一行序贯执行,且没有哪一行会出现卡死的情况。这种程序最符合人们对计算机程序的心理预期,也就是程序能做到“有问立答”。
  3. 异步+阻塞:虽然代码中某些部分会卡住,但是由于采用了异步的处理方式(包括callback、future、promise、reactiveX、async-await/coroutine),所以卡住行的下一行不会傻等,整个代码块也就不会卡住。这时虽然做不到有问立答,但是会给你一张小卡片上面写着“已受理,请稍等”,这种体验也不会太差。
  4. 异步+非阻塞:非阻塞情况下一般不会采用异步编程,这个组合属于脱裤子放屁。但是在兼有阻塞非阻塞的代码块中,由于整块都可能采用异步编程,所以也会出现这种组合。体验上讲也是有问立答,只是会稍稍慢一点,但感觉不出来。

一般来说,先看代码中有没有阻塞的部分,如果有阻塞了那就要立即考虑是不是上异步,也就是选取一种异步范式(callback、future、promise、reactiveX、async-await/coroutine)来重写代码。在Vert.x中的判断阻塞的标准是,任何一个调用必须2秒内返回结果,一旦超时就认为这段代码是阻塞的,也就是要变成异步。

所以上面4个组合中,“异步+阻塞“是最需要吃透的。

posted @ 2022-02-23 11:02  realDevin  阅读(54)  评论(0编辑  收藏  举报