什么是同步?
我对同步一直有个误区,以为等待的就是同步,比如http请求。事件发生只能一件一件来,一件结束才能开始下一件。通常下一件事物都处于等待状态,因为他依赖前一件事的结果,比如排队。前面的人没有把事情办好,后一个人就不能办事。对于严重以来前一件事情结果的,或者两件事情资源不能交叉的,那么设计为同步较好。
什么是异步?
就是两个work可以同时进行,你进行你的,我处理我的,可以互不干扰的同时运行。比如寄快递,我们去邮局寄快递后,无需等待快递寄到目的地才能回去,而是在邮局填好单子,付好钱,然后就回家了。接下来可以做其他事情了。两天后你的快递到达朋友手中,他微信你:“你的快递我收到了”。这就是典型的异步过程。但是去银行存钱,我们不会把钱放在柜台,填好单子,然后就回家了把。而是等到柜员把钱数好,存好后。告诉你钱已经到账了。然后回家。
所以?异步一定比同步快吗?
很长一段时间,我是这么认为的。项目优化的时候无脑把同步改成异步,以为服务的吞吐就能提升了。那么为什么银行存款业务不做异步处理呢?我们只是把钱放在柜台,然后回家等银行通知?除了安全性,其实存钱是很人力的操作。其中的数钱、确认金额、确认到账等步骤都是人力密集型的,也就是我们说的CPU密集型,你在不在银行柜台,他都得耗费这么多人力,节约不了时间。而快递采取异步处理,是因为整个过程耗费在人力上的时间很短,更多的是耗费在路上,即把物品从城市A派送到城市B,也就是我们说的IO密集型。
也就是说如果是IO密集型,那么等待时间会较长,等待时CPU会闲置,如果采用异步,CPU可以处理更多任务,可以加大整个系统的吞吐。如果是CPU密集型,过分的强调同步,反而会导致CPU频繁切换,导致吞吐下降。当然这个得根据实际情况而定。这就是我理解的同步和异步。