Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/408.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.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
Javascript NodeJS-是否可以有两个独立的集群?_Javascript_Node.js_Multithreading_Cluster Computing_Global - Fatal编程技术网

Javascript NodeJS-是否可以有两个独立的集群?

Javascript NodeJS-是否可以有两个独立的集群?,javascript,node.js,multithreading,cluster-computing,global,Javascript,Node.js,Multithreading,Cluster Computing,Global,TL;DR 有可能有两个不同的集群主节点不是共享的全局节点吗?例如创建一个新实例myCluster=newcluster() 较长的版本 在NodeJS中使用新的集群模块一段时间后,我遇到了两个独立集群重叠的问题。两个不同的库(npm包)访问同一个集群主机,因为集群模块在当前运行的进程中是全局的,无论您从哪里需要它 从任何库调用cluster.workers,都会列出每个库生成的每个worker 每个人都在为它的简单性和效率而发狂,但是在遇到两个库使用同一个集群的问题之后,我担心使用一些全局集群

TL;DR

有可能有两个不同的集群主节点不是共享的全局节点吗?例如创建一个新实例
myCluster=newcluster()

较长的版本 在NodeJS中使用新的集群模块一段时间后,我遇到了两个独立集群重叠的问题。两个不同的库(npm包)访问同一个集群主机,因为集群模块在当前运行的进程中是全局的,无论您从哪里
需要它

从任何库调用
cluster.workers
,都会列出每个库生成的每个worker

每个人都在为它的简单性和效率而发狂,但是在遇到两个库使用同一个集群的问题之后,我担心使用一些全局集群函数(如
cluster.disconnect()
)会相互干扰,或者访问全局workers对象
集群.workers
。我知道这是一个相当单一的用例模块,“创建一个自我可持续的一次性工人集群,可以通过看门狗轻松重启”

但对于多线程任务来说,它是最简单的解决方案,而且在
child\u进程
上粉饰了很多麻烦。如果两个库决定有必要使用
集群
,但没有努力跟踪属于它们的工作人员,而是称之为厚颜无耻的

Object.values(cluster.workers).forEach(worker => worker.kill())
作为他们的清理

集群是否可以有两个不同的“实例”或“名称空间”,以避免干扰任何其他集群主机?或者集群模块只是一个必须接受的全局变量

我已经深入研究了文档,但据我所知,无法通过调用
myCluster=new cluster()
来创建新的集群实例,也无法将一些唯一标识传递给forked worker。我感到惊讶的是,这个问题没有明显的解决方案,特别是考虑到它针对的是企业应用程序,而这些应用程序不应该存在这样的问题

编程的趋势(已经有一段时间了)是远离全局实例,创建只知道需要知道什么的自给自足实例,即所谓的“哑组件”。集群是NodeJS的一个全新的补充,他们是否已经决定一半实现一个伟大的特性

我将非常感谢你在这个问题上的想法或解决办法。现在我正在创建一个可以从任务分发中获益匪浅的库,但是我不想弄脏依赖于包的全局集群。我应该回到低级的
子进程吗

非常感谢

不,或者是

请参阅,因为节点术语中的集群意味着分叉当前进程,所以实际上没有集群——只有一个分叉=工作者的列表

但是:您可以使用fork并要求脚本(或者如果是在块中)将fork作为一个worker,并将该新worker保存到您自己的array=cluster/fork\u列表中

我有一个简单的支持模块,用于分离工作脚本(并简单地加载不同的脚本+处理通信):

回答我自己的问题 在切换到较低级别的
child\u进程
模块后,出于一个简单的原因,我已恢复到使用
集群
。js的
——检查
调试器

在调试另一个包时经历了很多痛苦之后,我将错误追溯到一个依赖项,该依赖项是我自己实现
child\u进程方法的库。它使用从父进程继承的
execArgs
来派生
子进程
,这意味着
子进程
正试图绑定到与父进程相同的检查器端口,无声地失败并崩溃

虽然我的第一个解决方法是为
子进程
生成一个随机免费(由操作系统分配)调试端口,但这是一个有效的解决方法,但也带来了自己的问题。首先,必须通过每次复制唯一端口来手动将进程附加到调试器

VS代码有一个神奇的AutoAttachChildProcesss,它可以发现分叉的进程,但只有在使用集群时才能发现,至少在我的情况下是这样。似乎
cluster
在分叉过程中有一些糖衣,使得它在调试过程中更容易发现和适应,或者VS代码只监听
cluster.fork()
。我已经放弃了让我的工作人员对整个应用程序可见的缺点,转而为用户提供更强大的体验

这是一种恼人的行为,在GitHub上有一个公开问题:



我的结论是,集群模块是为了提供更统一的分叉体验和更智能的进程处理和发现,包只需尊重永不接触
cluster.workers
或类似的全局函数,而是维护由
cluster.fork()返回的自己的worker数组

这就是我害怕的。。。不管是否分叉(您可以设置一个自定义脚本来开始使用集群),都应该有一个选项来创建一个本地化实例,该实例维护自己的工作线程数组。在我看来,没有理由让它全球化。我目前的解决方案是创建我自己的“集群”类,该类维护自己的工作人员列表,并使用
child\u process
对其进行管理。http服务器和其他服务器使用全局集群来处理负载平衡,并将一个使用过的端口分发到分支。还有一些其他模块依赖于此。如前所述:这都是关于分叉当前进程,而不是启动其他脚本。“群集”。我相信我已经看到NPM上的模块实际管理集群。