Node.js - 单线程,非阻塞?

时间:2015-04-28 06:01:47

标签: javascript node.js nonblocking

我正在学习Node.js,我已经读过Node.js是单线程和非阻塞的。

我有很好的JavaScript背景,我确实理解回调,但我真正理解的是Node.js如何可以单线程并在后台运行代码。这不矛盾吗?

因为如果Node.js是单线程的,那么它当时仍然只能执行一个任务。因此,如果它在后台运行某些内容,它必须停止当前任务以在后台处理某些内容,对吗?

这实际上如何运作?

4 个答案:

答案 0 :(得分:10)

背景""在NodeJS方面,实际意味着将事物放在待办事项清单上以供日后使用。每当Node完成它所做的事情时,它就从todo列表的顶部进行选择。这就是为什么做任何实际阻塞的事情都会破坏你的一天。在背景中发生的一切"" (实际上只是等待todo列表)停止,直到阻塞任务完成。

答案 1 :(得分:4)

卢卡斯解释得很好,但我想补充一点,这可以添加"节点"如果你想利用你的处理器,请通过一些集群库。

执行群集的教程:http://blog.carbonfive.com/2014/02/28/taking-advantage-of-multi-processor-environments-in-node-js/

有些托管商会给您带来可扩展性'选项,例如Heroku

无论如何,当您使用 MongoDB 与NodeJS(例如通过 Mongoose )时,它会创建多个连接。

注意:单线程的优点是处理数百万用户。使用传统的多线程服务器(apache),您可以为EACH用户创建一个线程,然后您需要真正的BIG服务器来处理数千人。

答案 2 :(得分:2)

虽然JavaScript引擎是单线程的,但在后台有多个线程可以处理所有非阻塞I / O工作。

具体来说,libuv有一个工作线程池,用于等待OS事件,I / O信号,运行C ++代码等。此池的大小由UV_THREADPOOL_SIZE环境变量确定。

没有JavaScript代码“在后台运行”。 JavaScript函数(即回调)被安排在主事件循环中稍后运行,由其他JS函数或直接由libuv worker运行。如果循环被阻止,那么所有安排的都必须等待它。

答案 3 :(得分:0)

事实上,Node.js并不完全是单线程的。 Node.js使用一个“主线程”,这是执行脚本的线程。绝不能阻止此主线程。因此,长时间运行的操作在不同的线程中执行。例如,Node.js使用libuv库来维护用于执行I / O的线程池。