所以我使用cluster
为一些朋友运行一些聊天机器人。我使用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
时,我最终会遇到同一个机器人的多个实例,这很俗气。)
答案 0 :(得分:1)
您似乎误解了cluster
的工作原理。它对这种情况没有帮助,主要是为了启动多个进程来监听HTTP连接的同一端口。
你现在拥有的是:
/bot1
/bot2
当请求进入端口3000
时,Node不知道该URL是什么。它只知道P2
和P3
都设置为处理该端口上的请求,因此它将随机选择一个来处理请求。
如果您向/ bot1发送请求并且Node随机指定它由P3
处理,那么您将收到错误Cannot GET /bot1
,因为P3
不知道这条路是什么意思。反过来也是如此。
也许您真正想要的是一些机器人进程和一个侦听端口3000的进程,然后使用worker.send()
等将消息转发到僵尸程序进程。