在NodeJs进程之间使用npm缓存

时间:2016-02-01 09:53:10

标签: javascript node.js

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

1 个答案:

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

}