所以我使用集群
为一些 friend 运行一些聊天机器人。我使用 express
为每个机器人运行一个页面。然而,集群不喜欢这样。我的代码(删节)类似于以下内容:
var configs = {
bot1:"bot1",
bot2:"bot2"
};
if (cluster.isMaster) {
for (var bot in configs) {
cluster.fork( { file:configs[bot] } );
}
} else {
var file = process.env["file"];
var page = "/" + process.env["file"];
var express = require("express");
var web = express();
web.listen(3000);
web.get(page,function(req,res){
res.send( file );
});
}
虽然这在理论上效果很好,但我只得到一个有输出的机器人。
如果我访问 example.com:3000/bot2
我会得到 bot2
作为输出。
如果我访问 example.com:3000/bot1
,我会收到 Cannot GET/bot1
。
哪一个可行似乎是随机的,但两者都行不通。
如果事情太简单或者无法完成,我们深表歉意。我只是发现cluster
在退出时重新启动自身更有效,并且通常比child_process
更稳定。 (有时,当我使用 child_process
时,我最终会得到同一个机器人的多个实例,这很俗气。)
最佳答案
您似乎误解了集群
的工作原理。它对于这种情况没有帮助,主要是为了启动多个进程监听同一端口的 HTTP 连接而设计的。
您现在拥有的是:
- P1 => 启动 P2 和 P3 的主进程。
- P2 => 监听端口 3000 处理
/bot1
- P3 => 监听端口 3000 处理
/bot2
当请求到达端口 3000
时,Node 不知道 URL 是什么。它只知道 P2
和 P3
都设置为处理该端口上的请求,因此它会随机选择一个来处理该请求。
如果您向/bot1 发送请求,并且 Node 随机分配该请求由 P3
处理,那么您将收到所看到的错误 Cannot GET/bot1
,因为 P3
不知道这条路径意味着什么。反之亦然。
也许您真正想要的是一定数量的机器人进程和一个监听端口 3000 的单个进程,然后使用 worker.send()
等将消息转发到机器人进程。
关于javascript - Node.js集群: have each worker render different page,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22503964/