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