我正在编写一个nodejs应用程序,我需要分叉主进程(process.fork)。我需要一个模块只需要一次,但是这个模块需要两次。示例代码说明:
a.js
var shared = require('./shared');
var cluster = require('cluster');
if(cluster.isMaster){
cluster.fork();
} else {
process.exit(0);
}
shared.js
console.log('Hello world');
module.export = { foo : 'bar' };
shared.js中的代码执行两次。有没有办法让它被激活一次? nodejs中每个线程是否有模块缓存?
编辑:在我的情况下,shared
包含使用winston的一些日志记录配置,并导出API以获取日志记录工具。我不会出于保密原因发布代码。为了使代码正常工作,我们决定让每个需要此模块的线程负责配置它。
答案 0 :(得分:2)
对于master执行一次,对fork执行一次,这就是它执行两次的原因。
如果你只想让它执行一次,你可以这样做:
var cluster = require('cluster');
if (cluster.isMaster) {
var shared = require('./shared');
cluster.fork();
} else {
process.exit(0);
}
您还可以在cluster.isMaster
文件中添加shared
项检查。
处理工作程序日志记录的最简单方法是让主进程处理它。我通常是通过从工作人员向主人发送消息来实现的,如下所示:
const cluster = require('cluster');
if (cluster.isMaster) {
const worker = cluster.fork();
const pid = worker.process.pid;
worker.on('message', function(msg) {
switch (msg.type) {
case 'uncaughtException':
// Handle uncaught exception from worker
// Perhaps fork it again?
break;
case 'console':
// Handle console logging from worker
// Add winston code here
break;
}
});
} else {
process.on("uncaughtException", function (err) {
process.send({ type: "uncaughtException", data: { message: err.message, stack: err.stack } });
process.exit(1);
});
// Override console
console.log = function () {
process.send({ type: "console", method: "log", data: [].slice.call(arguments, 0) });
};
console.error = function () {
process.send({ type: "console", method: "error", data: [].slice.call(arguments, 0) });
};
console.info = function () {
process.send({ type: "console", method: "info", data: [].slice.call(arguments, 0) });
};
console.warn = function () {
process.send({ type: "console", method: "warn", data: [].slice.call(arguments, 0) });
};
console.debug = function () {
process.send({ type: "console", method: "debug", data: [].slice.call(arguments, 0) });
};
}