gpt4 book ai didi

javascript - 在 NodeJs 进程之间使用 npm 缓存

转载 作者:行者123 更新时间:2023-11-30 16:18:23 27 4
gpt4 key购买 nike

我正在编写一个 nodejs 应用程序,我需要 fork 主进程 (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 以获取日志记录工具。出于保密原因,我不会发布代码。为了让代码正常工作,我们决定让需要此模块的每个线程的职责来配置它。

最佳答案

master 执行一次,fo​​rk 执行一次,这就是执行两次的原因。

如果你只希望它执行一次你可以这样做:

var cluster = require('cluster');

if (cluster.isMaster) {
var shared = require('./shared');
cluster.fork();
} else {
process.exit(0);
}

您还可以在 shared 文件中添加 cluster.isMaster 检查。

关于您的编辑的补充

处理工作人员日志记录的最简单方法是让主进程处理它。我通常通过从 worker 向 master 发送消息来做到这一点,如下所示:

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) });
};

}

关于javascript - 在 NodeJs 进程之间使用 npm 缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35127448/

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