Nodejs异步执行消除阻塞,感受并发优势之体验

212 阅读2分钟

最近在了解Nodejs,发现其异步操作特点,在解决高并发问题方面,具有优势。
在以往的高并发问题处理中,多线程是重要的解决方式,但这种方式会有一系列问题,比如线程阻塞,虽然可以通过锁的方式来解决,但锁用起来还是比较麻烦的,而采用异步的方式,就显得很方便了。
js的异步核心在于,所有异步操作会被挂起,在执行完同步操作后,再去执行异步操作。
在Node中,异步操作更加常见,也是其核心所在。

这里我手写两个异步函数,通过观察其执行过程来理解和体会异步:

 function f1(a,callback){
 		console.log(a);
   		var b=a+"boy"
   setTimeout(()=>{
   		callback(b)
   },5000)
 }

function f2(x){
	console.log("welcome"+x)
}

function f3(a,callback){
	console.log("爱上一匹野马"+a);
  	 setTimeout(()=>{
   		callback()
   },9000)
}
function f4(){
	console.log("家里没有草原")
}
f1("hei",f2);
f3("嘿",f4);

这里我写的两个异步函数中分别都有其同步操作

  • 在f1中
console.log(a);
  • 在f3中
console.log("爱上一匹野马"+a);

同时两个函数也分别有各自的回调,并且f1中的回调在5秒后执行输出,f3中的回调在9秒后执行输出。

现在我们运行这段代码,看看输出结果:

首先,点击运行后,马上会有如下执行结果:
在这里插入图片描述
这是因为异步回调的内容,所以会立即执行,
但令人意外的是,我原以为f3中的非异步回调内容会在f1回调结束后再执行,毕竟他们是不同的两个函数,但结果是所有异步先被挂起,所有非异步先进行了执行,所以这两句话立即被执行,即使他们是不同函数的内容。

然后,5秒后,又可以看到:
在这里插入图片描述
再4秒后,即从开始执行函数算起的9秒后:
在这里插入图片描述
自此,结束。

总结:

从这段代码的执行过程,我们可以看出所谓的异步的真实过程,而正如《深入浅出Nodejs》书中所讲的,此时的运行时间为异步最久的那个时间,而非多异步时间的累积。