Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading node.js异步逻辑行为 我正在构建一个CPU密集型的Web应用程序,在这里,我将在C++中编写CPU密集型的东西,同时在NoDE.js中写入Web服务器。No.js将通过附加连接到C++。我对一件事感到困惑-_Multithreading_Node.js - Fatal编程技术网

Multithreading node.js异步逻辑行为 我正在构建一个CPU密集型的Web应用程序,在这里,我将在C++中编写CPU密集型的东西,同时在NoDE.js中写入Web服务器。No.js将通过附加连接到C++。我对一件事感到困惑-

Multithreading node.js异步逻辑行为 我正在构建一个CPU密集型的Web应用程序,在这里,我将在C++中编写CPU密集型的东西,同时在NoDE.js中写入Web服务器。No.js将通过附加连接到C++。我对一件事感到困惑-,multithreading,node.js,Multithreading,Node.js,假设每个请求的CPU密集型操作的时间是5秒(可能这涉及到反转一个巨大的矩阵)。当这个请求通过时,绑定到C++的NoDE.js会将此请求发送到C++代码。p> 现在这是否意味着node.js在接下来的5秒钟内不会被捕获,可以继续服务其他请求 我很困惑,因为我听说即使node提供异步特性,它仍然是单线程的 显然,我不希望node.js被卡住5秒钟,因为这是一个巨大的代价。想象一下,对于这个密集的操作,同时有100个请求。节点的主线程是JS事件循环,因此与JS交互的所有逻辑都是单线程的。这还包括任何直

假设每个请求的CPU密集型操作的时间是5秒(可能这涉及到反转一个巨大的矩阵)。当这个请求通过时,绑定到C++的NoDE.js会将此请求发送到C++代码。p> 现在这是否意味着node.js在接下来的5秒钟内不会被捕获,可以继续服务其他请求

我很困惑,因为我听说即使node提供异步特性,它仍然是单线程的


显然,我不希望node.js被卡住5秒钟,因为这是一个巨大的代价。想象一下,对于这个密集的操作,同时有100个请求。

节点的主线程是JS事件循环,因此与JS交互的所有逻辑都是单线程的。这还包括任何直接通过JS.< /P>触发的C++逻辑。 通常,任何长时间运行的任务都应该划分为工作进程。例如,在您的例子中,您可能有一个工作进程,该进程将对计算进行排队,在计算完成后将事件发送回JS线程


<> P> >这是一个关于如何通过AuthON//COD>代码连接到C++的<代码>的问题。

< P>试图理解JS回调和异步性逻辑,我遇到了以下描述的许多不同版本;p> 作为参数传递给另一个函数的回调函数将运行 遵循传递给的函数的耗时过程

这种困境起源于“耗时”形容词。就这样

  • 由于CPU空闲和等待响应而花费的时间
  • 因为CPU忙着像地狱一样处理数字而花费的时间
这是不清楚的描述和困惑我。因此,我尝试了以下两种代码

getData('http://fakedomain1234.com/userlist",书面资料),;
document.getElementById('output').innerHTML+=“在数据之前显示此…”;
函数getData(dataURI,回调){
//通常你会在这里连接到服务器。
//我们将模拟一个3秒的延迟。
var timer=setTimeout(函数(){
VarDataArray=[12345678912345678];
回调(数据数组);
}, 3000);
}
函数writeData(myData){
document.getElementById('output').innerHTML+=myData;
}


我不打算提及Node.js的细节,因为我不太熟悉内部架构及其允许的可能性(但我知道它支持多个工作线程,每个线程代表不同的事件循环)

一般来说,如果您需要处理100个请求/秒,这需要5秒的CPU时间,那么除了确保有500个处理器可用外,您什么也做不了

如果100个请求/秒是峰值,而平均值会低很多,那么解决方案就是排队,您使用队列来承受冲击

现在,当不是5秒的固定CPU时间,而是0.1 CPU时间和4.9等待时间或介于两者之间的任何时间时,事情开始变得有趣起来。在这种情况下,应使用异步处理将所有等待时间投入工作

在这种情况下,异步意味着:

  • 所有执行都发生在事件循环中
  • 您不必等待,无睡眠,无阻塞I/O,只需执行或返回事件循环
  • 将任务拆分为非阻塞子任务,并插入(异步)事件(例如,带有响应)以继续执行
  • 您将系统拆分为多个事件处理服务,通过异步事件交换请求和响应,并协作提供总体功能
如果您有一个子系统,在上述原则下无法转换为异步服务,该怎么办

答案是用队列(吸收请求)+多个线程(允许在其他线程等待时执行某些线程)来包装它,从而提供其他子系统所期望的异步事件请求/响应接口

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


Node.js很好,因为它的输入/输出本质上是异步的,所有的基础设施都是为了实现我上面描述的那种东西。

我可能错了,但我相信您的示例并没有说明这一点。在第一个示例中,您的代码(
getData()
)没有等待3秒,它设置了一个异步计时器并返回到事件循环(如果由事件循环调用),而不需要任何时间。在第二个场景中,回调函数由
getData()
事件处理程序(不是真正的事件回调)同步调用。我的观点是,代码在事件线程上运行,如果从该事件处理程序调用回调(或函数),它将在同一线程上同步运行。b) 但是,设置为在外部或内部事件上运行的代码将在事件处理时异步运行(并由处理事件的事件线程异步运行)[异步运行,因为事件是异步的….但与事件处理同步]