Origin X Documentation

天行有常,不为尧存,不为桀亡。——荀子《天论》

同步和异步

1. 基本概念

同步【Synchronous】,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。简单说就是必须一个任务一个任务地做,等前一件做完了才能做下一件事。

异步【Asynchronous】,异步的概念和同步是相对的,当一个异步过程调用发起后,调用者同样不能立即得到结果,实际处理这个调用的部件在完成后,通过状态、通知和回调通知调用者。而调用者在发起调用后可做其他事,因为被调用者会通过状态、通知、回调三种途径来通知调用者。

以Web请求为例,同步和异步调用流程如下:

上边的调用模式是一致的,唯一的不同就是红色部分客户的Client什么都不能干,而绿色部分客户端Client可以干它自己的事,这个时候它只需要等待响应回来即可。

2. 字面理解

同步和异步的字面理解在这里是面向“数据”的,如果使用同步请求,那么数据本身会在该调用过程维持同步,因为客户端任何时候都可以拿到服务端的最新数据,并且是在最新数据得到过后才继续执行;而异步模式下,客户端在不用等待服务端响应的过程中,实际上拿不到最新的数据,它的最新数据必须是在异步回调过后才拿到,如果这个过程中的数据依赖于请求处理结果,那么异步模式的场景就显得不合适了。

3. 总结

同步和异步没有优劣之分,单从资源利用率上看,异步的资源利用率明显优于同步,且性能高很多,但异步并不适用于所有场景,而且大部分应用对于数据本身的同步有所要求,所以异步编程面临的挑战就是如何组织所有的异步块,特别是那些有依赖关系的异步块应该通过哪种方式来完成。