node.jsasynchronous逻辑行为

我正在构build一个CPU密集型Web应用程序,在那里生病写在C ++的CPU密集型的东西,而不是写在node.js中的Web服务器。 node.js将通过插件连接到c ++。 我对一件事感到困惑 –

说每个请求CPU密集型操作的时间是5秒(也许这涉及反转一个巨大的matrix)。 当这个请求通过时,绑定到c ++的node.js会把这个请求发送给c ++代码。

现在这是否意味着node.js在接下来的5秒内不会被捕获,并且可以继续服务其他请求?

我很困惑,因为我听说即使节点提供asynchronousfunction,它仍然是单线程的。

很明显,我不希望node.js被困在5秒钟,因为它是一个巨大的代价。 想象100个请求同时进行这个密集操作。

试图了解JScallback和asynchronous逻辑,我遇到了以下描述的许多不同版本;

一个callback函数作为一个parameter passing给另一个函数,跟随它传递给它的函数的时间处理。

困境源于“时间”形容词。 就是这样

  • 由于CPU空闲并等待响应而花费时间?
  • 由于CPU忙于数字捣乱像地狱一样占用时间?

这在描述中并不清楚,使我感到困惑。 所以我尝试了以下两个代码。

getData('http://fakedomain1234.com/userlist', writeData); document.getElementById('output').innerHTML += "show this before data ..."; function getData(dataURI, callback) { // Normally you would actually connect to a server here. // We're just going to simulate a 3-second delay. var timer = setTimeout(function () { var dataArray = [123, 456, 789, 012, 345, 678]; callback(dataArray); }, 3000); } function writeData(myData) { document.getElementById('output').innerHTML += myData; } 
 <body> <p id="output"></p> </body> 

Node的主线程是JS事件循环,所有与JS交互的逻辑都是单线程的。 这还包括通过JS直接触发的任何C ++逻辑。

通常任何长期运行的任务都应该分解成工作进程。 例如,你的情况,你可以有一个工作进程,排队计算,发射事件回到JS线程,当他们已经完成。

所以真的,这是一个问题,你怎么去connected to c++ via addons代码connected to c++ via addons

我不会去引用Node.js的细节,因为我不熟悉内部体系结构及其允许的可能性(但是我明白它支持多个工作线程,每个线程代表不同的事件循环)

一般来说,如果您需要处理100个需要5秒钟可靠CPU时间的请求,那么除了确保您有500个可用处理器外,您无能为力。

如果100个请求是峰值,平均而言,它将会低得多,那么解决scheme就是排队,并且使用队列来吸收这个冲击。

现在事情开始变得有趣,当它不是5秒坚实的CPU时间,但0.1 CPU时间和4.9等待或之间的任何东西。 在这种情况下,应该使用asynchronous处理来完成所有等待时间。

这种情况下的asynchronous意味着:

  • 你所有的执行都发生在一个事件循环中。
  • 不会等待不睡觉不阻止I / O ,只是执行或返回到事件循环。
  • 你把你的任务分成非阻塞的子任务,与(asynchronous)事件(如响应)交织,继续执行。
  • 您可以将系统分成多个事件处理服务,通过asynchronous事件交换请求和响应,并协作提供整体function。

如果你有一个子系统,你不能根据上述原则变成asynchronous服务,该怎么办?

答案是用队列(吸收请求)+multithreading(允许其他线程正在等待某些线程的执行)包装它,提供其他子系统期望的asynchronous事件请求/响应接口。

在所有情况下,最好保持有限数量的线程(而不是每个请求线程模型),并始终将系统中活动/热线程的总数保持在处理资源数量以下。

Node.js的好处在于它的input/输出本质上是asynchronous的,所有的基础结构都是为了实现上面描述的那些事情而devise的。