如何理解阻塞非阻塞与同步异步的?
最近在看Node.js相关内容,对单线程函数式异步编程不是很了解,于是搜集了相关资料整理了一下自己的思路,来谈谈我对阻塞非阻塞,同步与异步编程的区别(如有见解不当的地方,望指出,定会积极吸取)。
先举一个通俗的例子然后在做分析:
- 同步于异步
同步:今天你去超市买东西,你打电话问女友今天吃什么,然后女友说:”让我想一想,想一想~”这一想可能很长时间,你在旁边等着直到她说我想吃: “红烧肉”(结果返回)然后你就去买食材。
异步: 你打电话问老妈红烧肉怎么做,她说:”有点麻烦,一时半会儿说不全(程序复杂,费时),等我理好思路之后给你发微信吧”(通过状态,通知或者回调函数通知调用者)。这时候你不用等待,去买其他东西了。(立即处理执行后面的程序)
同步和异步关注的是消息通信机制
所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由调用者主动等待这个调用的结果。
而异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用。
- 阻塞与非阻塞
阻塞:你在超市食材区排队买肉,这时候货架上肉卖完了,需要等待售货员询问是否还有肉,这时候你就一直在等(线程被挂起),直到新的肉到来或者库存已空(结果返回)。
非阻塞:你在超市除了想买食材还想买水果,买日用品等,这时候你不打电话了,发微信给女友说:“你想吃什么,想好告诉我,我正在超市买东西”。这时候你不用等她立即回复,你去买水果,日用品等,但主要目的买菜还没得到回复,所以你时不时的去看一下微信(轮询查看是否返回结果)
阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态
阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。