6

私のエクスプレスサーバーには、子プロセスとして実行する必要のある関数がいくつかあります。そうしないと、サーバーが拘束され、他の人がアクセスできなくなるためです。彼らはすでに非同期モジュールを使用していますが、子プロセスとして実行されていない限り、サーバーを拘束します。

1つの問題は、reqパラメーターとresパラメーターをそれらに渡すことです。

これはどのように行うことができますか?

4

1 に答える 1

15

child_process.forkを使用すると、子プロセスにメッセージを送信できます。

編集:子プロセスにメッセージパラメータとして渡すように誤ってアドバイスしましreqた。res子プロセスとの間のすべてのメッセージがJSONに変換されるため、これは不可能です。代わりに、サーバーにある種のキューを保持することができます。以下は単なる例であり、より堅牢なものが必要な場合があります。

child.js:

process.on('message', function(message) {
    // Process data

    process.send({id: message.id, data: 'some result'});
});

server.js:

var child_process = require('child_process');
var child = child_process.fork(__dirname + '/child.js');
var taskId = 0;
var tasks = {};

function addTask(data, callback) {
    var id = taskId++;

    child.send({id: id, data: data});

    tasks[id] = callback;
};

child.on('message', function(message) {
    // Look up the callback bound to this id and invoke it with the result
    tasks[message.id](message.data);
});

app.post('/foo', function(req, res) {
    addTask('some data', function(result) {
        res.send(result);
    });
});

もう少し複雑ですが、機能するはずです。あなたはそのようなシステムからすぐに成長するかもしれません、そして適切なキューによってよりよく役立つかもしれません。

于 2012-06-03T13:15:03.950 に答える