同步和异步
同步和异步是两种不同的消息通信机制,我们以客户端(调用者)和服务端(被调用者)之间的通信为例:
- 同步: 就是指客户端调用服务端的某个东西时,在没有得到调用结果之前,该调用就不会返回。也就是说客户端必须等到这个调用返回结果才能继续往后执行;
- 异步: 和同步相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当客户端发送出了一个异步调用后,它不会立刻得到结果,而是在未来的某个时间,服务端通过状态、通知来通知客户端你的这个异步调用成功了,或者也可以通过回调函数来处理这个异步调用的返回结果。
举个通俗的例子,打电话:
-
你打电话问书店老板有没有某本书,如果是同步通信机制,书店老板会说,“您稍等,我查一下”,然后开始查啊查,等查好了(可能是 5 秒,也可能是一天)告诉你结果(返回结果);
-
而异步通信机制,书店老板直接告诉你 “我查一下啊,查好了打电话给你”,然后直接挂电话了(不返回结果)。然后查好了,他会主动打电话给你。在这里老板通过 “回电” 这种方式来回调。
阻塞和非阻塞
另外,关于同步和异步,需要区别于阻塞和非阻塞,这几个概念经常容易混淆。
阻塞和非阻塞关注的是客户端在等待调用结果时的状态:
- 阻塞调用,是指调用结果返回之前,客户端的当前线程会被挂起,这个调用线程只有在获取到服务端的调用结果之后才能继续运行;
- 非阻塞调用,就是说即使客户端的线程无法立即获取到服务端的调用结果,这个线程也不会被阻塞,它可以继续去做其他的事情。
还是上面打电话的例子:
-
你打电话问书店老板有没有某本书,如果是阻塞式调用,你会一直把自己 “挂起”,直到得到这本书有没有的结果;
-
如果是非阻塞式调用,你不管老板有没有告诉你,你自己就先去做别的事情了, 当然你也要偶尔过几分钟 check 一下老板这边有没有返回结果。