因此,我有点担心在涉及node.js集群时可以在线找到的示例代码,例如:
if (cluster.isMaster)
{
console.log('Initializing...');
// Fork workers.
for (let i = 0; i < os.cpus().length; i++)
{
cluster.fork();
}
}
else
{
doWork();
}
对于具有4个物理核心的系统,此代码将为每个核心派生4次。这意味着我们最终得到了主线程+ 4个工作线程== 5个线程。
似乎我们的工人多于我们的能力!为确保主线程正常运行,代码是否不应为os.cpus().length - 1
,以便我们为主线程留出一个可用的内核?
出于我的目的
我正在运行UDP服务器,我希望一半的工作人员处理传入的数据包,而另一半则在setInterval函数内部每秒发送大量的数据包。
我不希望主线程(正在执行负载平衡)与处理传入数据包的工作线程之间存在任何延迟,因此我想确保主线程以100%的速度工作。
在那种情况下,我应该在分支for循环中使用os.cpus().length - 1
,还是使用os.cpus().length
?
谢谢!
编辑:我注意到那里有一个与我的问题类似的问题,并且答案说明,主线程通常在分配上花费很少的时间,因此保留一个可用的内核可能会使该内核处于空闲状态。我相信这对于TCP / IP是正确的,但就我而言,我希望每个“连接”到我的服务器的客户端每秒大约30至60个数据包,因此会有不断的数据包流入,这可能与TCP / IP流量的外观不同。
答案 0 :(得分:0)
我相信主线程只是一个负载平衡器,只是将请求定向到每个生成的/派生的工作线程。因此,您的应用程序每个核心有一个线程+一个线程来管理请求。如果您拥有os.cpus()。length-1,那么您将不会利用所有的CPU内核。