child_process モジュールは、あなたが望むことをいくらか行います。
唯一の問題は、文字通り新しいプロセスを生成することです。そのため、考慮しなければならないメモリ オーバーヘッドがあります。サブルーチンを同じファイル内で定義するエレガントさが必要であると仮定すると、JavaScript 文字列をコマンドに渡すことができます。node
したがって、これがまさに私たちが行うことです。しかし、最初に、JSON 互換オブジェクトを受け入れる関数と、その関数を新しいスレッドで実行する関数を作成しましょう。
var child_process = require('child_process');
function startThread(data, fn, callback) {
var fnStr = '(' + fn.toString() + ')(' + JSON.stringify(data) + ');';
var node = child_process.spawn('node', ['-e', fnStr]);
var output = [];
var onData = function (data) {
output.push(data.toString('utf8').trim());
};
node.stdout.on('data', onData);
node.stderr.on('data', onData);
node.on('close', function (code) {
callback(code, output);
});
}
例として、「ビール 99 本」の歌詞を生成する新しいスレッドを作成します。
startThread({ doFor: '99' }, function (data) {
var str = '';
while (data.doFor) {
str += data.doFor + ' bottles of beer on the wall ' + data.doFor +
' bottles of beer. You take one out, toss it around, ';
data.doFor--;
str += data.doFor + ' bottles of beer on the wall\n';
}
console.log(str.trim());
}, function (code, outputs) {
console.log(outputs.join(''));
});
残念ながら、他の「スレッド」で使用される関数は、親スレッドの変数にアクセスできません。
また、データは STDOUT および STDERR を介して渡されます。