节点JS处理器架构

问题描述 投票:0回答:2

我试图获取有关节点JS架构的解决我的问题。

我知道JS节点是单线程的工作在事件循环和非阻塞机制。

但我的问题是如何它背后的处理器作品它同步工作和优先?或者它可以在多个请求同时单核机器上。

试图通过创建两个API的在第一个API来验证这一点我创建了一个while循环,而在第二个API,我创建的Hello World的响应。

然后我试图打两个API的第1和第2次,然后但第二API是等待第一个结束所以这里的处理器不工作的第二API,直到第一端。

所以,我可以说,节点JS的处理器将同步顺序而不是并行工作?

因此,所有的请求都将在队列中等待先前请求完成?

javascript node.js architecture
2个回答
0
投票

从我的角度来看,事情是,这个问题的答案并非如此简单。

1)如果我们是在谈论ExpressJS然后是它的工作原理同步

2)但是,让我们说,我们正在谈论的NodeJS内置处决,喜欢的HTTP模块它可以异步拨打电话(但它取决于哪个是的NodeJS运行OS)。

在不同的NodeJS模块的行为不同从同步到异步的。 V8的NodeJS基于VUlibs这实际上是基于C ++库和这些库大多使用的线程机制。就像密码模块最多可以在一定程度上异步运行的执行。


0
投票

JavaScript是单线程的 - 永远,它不是先发制人无论是。所以,事件发生时,一些JavaScript开始响应该事件并没有其他的JavaScript运行可以运行,直到事件处理函数返回通过从被称为启动事件处理程序回调返回控制返回给解释。

在这一点上,另一事件可以发射并运行另一个事件处理程序,并再次没有其他JavaScript可以运行,直到事件处理函数返回到系统中。

这对于所有的JavaScript导入Node.js运行是真实的。

唉唉,而不是你在node.js中做的每一件事实际上是使用Javascript。让我们假设你有两个简单的定时器:

console.log("A");
setTimeout(function() {
   console.log("B");
   fs.readFile("smallfile.txt", function(err, data) {
       console.log("C");
   });
   console.log("H");
}, 1000);

console.log("D");

setTimeout(function() {
   console.log("E");
   fs.readFile("bigfile.txt", function(err, data) {
       console.log("F");
   });
   console.log("I");
}, 1000);

console.log("G");

这将记录在控制台

A
D
G
B
H
E
I
C
F

让我们来讨论一下为什么它会做到这一点。

A是显而易见的,它是第一个发言。

然后,代码调用setTimeout()这是非阻塞和异步。因此,它是所有计划在未来一段时间内的计时器,然后立即返回。该setTimeout()回调不会是准备被调用1000毫秒,因此不会被调用现在。

因此,setTimeout()调用返回后接下来,我们执行console.log("D");

然后,执行下一个setTimeout()这又只是时间表1000毫秒的计时器现在并立即返回。

然后,它执行console.log("G");

在这一点上,它返回控制权归还给JS解释,它有没有别的了一小会儿的事。

然后,大约1000毫秒后,第一个定时器setTimeout()坚持在事件队列中的计时器事件,因为JS解释没有运行任何其他JavaScript,它抓住这一事件,并运行与该事件相关的JS回调。立即登录console.log("B");

然后,它调用fs.readFile("smallfile.txt", ...)。这又是非阻塞和异步所以它的作用是告诉底层的本地代码FS模块实现去读取该文件中的所有数据,然后立即返回。然后,它运行console.log("H");。在这一点上,它与此事件处理完成并返回控制返回给解释。

与此同时,所以JS解释拉从事件队列中的事件,并呼吁与它相关的回调第二setTimeout()事件已准备就绪。

运行console.log("E");,然后调用fs.readFile( “bigfile.txt”,...). This is again non-blocking and asynchronous so all it does is tell the underlying native code fs module implementation to go read all the data from this file and then returns immediately. It then runsconsole.log( “I”);`。在这一点上,它与此事件处理完成并返回控制返回给解释。

一段时间后,该fs.readFile("smallfile.txt", ...)完成和将事件插入事件队列。由于JS解释有没有别的事情可做,就获取该事件并运行与此相关的回调,我们看到console.log("C")的结果。即接完并把控制返回到解释。

一段时间后,该fs.readFile("bigfile.txt", ...)完成和将事件插入事件队列。由于JS解释有没有别的事情可做,就获取该事件并运行与此相关的回调,我们看到console.log("F")的结果。即接完并把控制返回到解释。

此时一切都做。

希望你能看到怎么操作异步(在本机代码实现可以并行使用Javascript执行使用其他CPU内核上运行),他们是通过将事件的事件队列使用Javascript执行同步。当JS解释器运行完一个事件处理程序,它可以再看看在事件队列中下一个事件来运行,如果什么都没有了,去睡觉,直到下一个事件插入事件队列。

因此,虽然本机代码实现可以在使用Javascript并行运行,还是有使用Javascript的执行只有一个线程运行在同一时间,另外一个不能运行,直到前一个收益由任何事件处理程序回调返回控制返回给解释开始执行。

内部事件循环,其实有一堆用于不同类型的事件的不同类型的队列,他们具有相对于一个稍微不同的优先级另一个所以它比我这里描述的这一切有点复杂,但的核心概念是运行的Javascript只有一个事件在时间(单线程)和可以在使用Javascript执行一个并行运行某些操作是与JavaScript的通过执行单一线程同步的本机代码的实现相关联的事件驱动的系统事件队列。

© www.soinside.com 2019 - 2024. All rights reserved.