《了不起的nodejs》阅读中产生的一个疑惑
发布于 8 年前 作者 warmhole 4576 次浏览 来自 问答

各位好,我在阅读《了不起的Node.js》中了解到Nodejs是运行在单线程里面的(我称呼它为主线程吧,因为处理那些io等耗时操作的是worker thread),当执行栈在执行的时候实际上它只能处理一件事情,比如对于HTTP请求,它一次只能处理一个。 书中有这么一句话:The key is that you don’t need to handle more than one at the same given instant, provided that the call stack executes really fast. 那么我想问:是nodejs不支持同时处理多个任务的能力(不考虑其他变相实现多线程)还是我们说我们的应用不需要(我们不需要同时并发处理http请求吗)?第一次提问nodejs问题,描述不清还请见谅! QQ图片20160107111327.png

4 回复

在单核的CPU下,就算是多线程的程序同一时间CPU也只能执行一个线程,然后在多个线程之间切换执行. 真正意义的并发是要在多核CPU下面才有吧.所以nodejs需要用到cluster模式才能利用所有的CPU

并发(concurrent)和并行(parallel)是有本质的区别的,很多时候我们并不刻意区分而已。 并发是看起来一起在干,并发是需要其他人支持的,比如其他设备,其他CPU核,其他电脑。 并行是不但看起一起在干,而且肯定一起在干,并行一般都自己干了,比如多核GPU,CPU。

单进程nodejs严格意义上讲只提供了并发能力,并不提供并行能力。某个时刻nodejs只能处理一个连接,当这个连接发起访问数据库之类的异步操作后,就让出了CPU给其他连接,如此循环,看起来像是同时处理,其实本质上是顺序处理的。大家可以试着在nodejs里写一个非常耗时的操作,看看是不是被阻塞了?

@holyselina @coordcn 谢谢!书上有这样的例子: var start = Date.now(); setTimeout(function () { console.log(Date.now() - start); for (var i = 0; i < 1000000000; i++){} }, 1000); setTimeout(function () { console.log(Date.now() - start); }, 2000); 说明nodejs在同一时刻是只能做一件事情的

@warmhole 怎么解释? 跟预期相符啊

回到顶部