gpt4 book ai didi

node.js - 无法杀死 Node JS 集群中的特定工作线程

转载 作者:太空宇宙 更新时间:2023-11-04 03:27:57 24 4
gpt4 key购买 nike

我使用 node + express 作为我的 Web 服务器,并且有一个由 4 个 worker 组成的集群

我尝试了几种方法来故意杀死一个 worker :

  1. process.exit() 在 Controller 中,并使用浏览器操作触发。以为这只是针对单个工作进程,但结果发现所有工作人员都被杀死了。

  2. 再次在 Controller 中,我让 workermaster 发送自杀公告:

    process.send('自杀');

这是我的主要流程:

if (cluster.isMaster) {
console.log(`Master cluster setting up ${numWorkers} workers...`);

for (let i = 0; i < numWorkers; i++) {
const worker = cluster.fork();
worker.on('message', msg => {
console.log(worker.process.pid + ' wants to suicide');
worker.kill();
process.kill(worker.process.pid);
});
}
}

事实证明,worker.kill()根本不受影响,并且process.kill(worker.process.pid);再次杀死了所有4个worker。另外,console.log 出现了 4 次,我不明白。我使用浏览器触发了一些操作,从而触发了自杀公告,这不应该是单个 worker 的行为吗?

我也在项目中使用WebSockets并保持连接,不知道这是否重要。如有任何帮助,我们将不胜感激!

编辑:

感谢@Mia,我找到了原因:当我将 process.exit() 放入 else 语句中时(当 cluster.isWorker 时),它工作正常,但当放入特定 Controller 时,结果会影响所有工作人员。还不知道怎么解决。 Controller 不应该只影响一名特定的工作人员吗?

最佳答案

很抱歉写在这里,由于我的声誉,我无法发表评论。我写了如下内容并且效果很好。首先创建集群并打开服务器,每当集群收到请求 app.get("/") 时,2 秒后它就会通过 process.exit 方法退出。您可以通过打印剩余的工作人员来确认这是否有效。

'use strict';

const cluster = require('cluster');
const os = require('os');

if (cluster.isMaster) {
const cpus = os.cpus().length;
for (let i = 0; i < cpus; i++) {
cluster.fork();
}

cluster.on('exit', (worker, code) => {

console.log(`${worker.process.pid} is killed`);
console.log("remaining wokers");
const workers = Object.keys(cluster.workers);
for(let worker of workers){
console.log(cluster.workers[worker].process.pid);
}

});

} else {

console.log("process id ",process.pid);

const express = require("express");
const app = express();
const path = require("path");
const fs = require("fs");
const http = require('http').Server(app);
const io = require('socket.io')(http);
const bodyParser = require('body-parser');

app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())
app.use(express.static('public'));

app.get('/',function(req,res){
console.log("connected via" , process.pid);
setTimeout(()=>{
process.exit();
},2000)
res.sendFile(path.join(__dirname+"/public/view/index.html"));
});

http.listen(3000);

}

----------------------------代码分成模块--------------

根目录(server.js)

'use strict';

const cluster = require('cluster');
const os = require('os');

if (cluster.isMaster) {
const cpus = os.cpus().length;
for (let i = 0; i < cpus; i++) {
cluster.fork();
}

cluster.on('exit', (worker, code) => {

console.log(`${worker.process.pid} is killed`);
console.log("remaining wokers");
const workers = Object.keys(cluster.workers);
for(let worker of workers){
console.log(cluster.workers[worker].process.pid);
}

});

} else {

console.log("process id ",process.pid);

const express = require('./modules/express');
const http = require('http').Server(express);

http.listen(3000);

}

express

const express = require("express");
const app = express();
const bodyParser = require('body-parser');
const route = require('../route');

app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())
app.use(express.static('public'));

route(app);

module.exports = app;

路线(index.js)

const HomeController = require('../controllers/HomeController');
module.exports = function(app){
app.get('/',HomeController.renderIndex);
app.get('/killProcess',HomeController.killProcess);
}

家庭 Controller

const path = require('path');

exports.renderIndex = function(req,res){
console.log("connected via" , process.pid);
res.sendFile(path.join(__dirname+"/../public/view/index.html"));
}

exports.killProcess = function(req,res){

res.write(`current process ${process.pid} is killed`);
res.end();
process.kill(process.pid);

}

客户端(浏览器)

  $("#kill").on("click",function(e){
$.ajax({
url:"/killProcess"
}).success(function(data){
console.log(data);
})
})

关于node.js - 无法杀死 Node JS 集群中的特定工作线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42106004/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com