怎样理解阻塞非阻塞与同步异步的区别?

如何理解阻塞非阻塞与同步异步的区别?

最近在看Node.js相关内容,对单线程函数式异步编程不是很了解,于是搜集了相关资料整理了一下自己的思路,来谈谈我对阻塞非阻塞,同步与异步编程的区别(如有见解不当的地方,望指出,定会积极吸取)。




同步与异步


先举一个通俗的例子然后在做分析:

**同步**:今天你去超市买东西,你打电话问女友今天吃什么,然后女友说:"让我想一想,想一想~"这一想可能很长时间,你在旁边等着直到她说我想吃: "红烧肉"(结果返回)然后你就去买食材。

**异步**:你打电话问老妈红烧肉怎么做,她说:"有点麻烦,一时半会儿说不全(程序复杂,费时),等我理好思路之后给你发微信吧"(通过状态,通知或者回调函数通知调用者)。这时候你不用等待,去买其他东西了。(立即处理执行后面的程序)

**同步和异步关注的是消息通信机制**
所谓同步,就是在发出一个**调用**时,在没有得到结果之前,该**调用**就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由*调用者*主动等待这个*调用*的结果。

还是上一个例子:

**阻塞**:你在超市食材区排队买肉,这时候货架上肉卖完了,需要等待售货员询问是否还有肉,这时候你就一直在等(线程被挂起。。),直到新的肉到来或者库存已空(结果返回)。

**非阻塞**:你在超市除了想买食材还想买水果,买日用品等,这时候你不打电话了,发微信给女友说:“你想吃什么,想好告诉我,我正在超市买东西”。这时候你不用等她立即回复,你去买水果,日用品等,但主要目的买菜还没得到回复,所以你时不时的去看一下微信(轮询查看是否返回结果)

阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)的状态
阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。



node.js就属于典型的异步非阻塞编程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章