spawn-limit
というモジュールを作りました。node.jsのchild_process.spawn()の薄いラッパーで、通常のspawnはChildProcessオブジェクトを返して、そいつに色々イベント登録して・・・という使い方をするんですが、プロセスを起動したらthenが呼ばれるPromiseを返すモジュールです。
ブラウザでサーバ間通信のコールバックの管理をPromiseでやるのは問題になることはないと思います。ネイティブのレイヤーで同時通信数を絞ってくれるので、アプリレイヤーで細かいことを考える必要はないでしょう。
今回はnode.jsで外部プロセスを起動しまくるコードを書いたら、プロセス数制限に引っかかって死という状況で、コードをちまちま直すのも辛かったし、呼び出し個所も複数にわたっていて、一箇所で制限するのもできなかったので、spawnそのものの数を絞るという方向でライブラリを作りました。方向性としては↓これのプロセス版ですね。プロセス数の制限数以上にspawnしようとすると、起動中のプロセス数が減るまでは起動を遅延させます。
@shibu_jp http://t.co/rDnMg8zRoH 自分は公開apiをプロミス使うときに困ったので作りました。
— ゆあ☆ミ (@you21979) May 11, 2015
基本的にPromiseが帰る以外は一緒です。引数もそのまま child_process.spawn()
に渡しているだけなので100%互換です。
var spawn = require("spawn-limit").spawn;
var promise = spawn("ls", ["-la"], {cwd: "~"});
promise.then(function (ls) {
ls.stdout.on("data", function (data) {
console.log(data.toString());
});
ls.on("close", function (code) {
console.log("code:", code);
});
});
決まった並列数までは増やすので、 child_process.spawnSync()
を使うよりは効率は良いと思います。内部でPromise使っているんですが、Promiseクラスがなくても、bluebirdかnodegit-promiseがあれば代わりに使います。0.10.xでも安心ですね!
最後にムカつく会長のツイートも張っておきますね☆
@shibu_jp まだそんな世界線にいるんですか?? こっちはio.jsですよ。あとそういう人のために execsyncsっていうやつがあります。 http://t.co/Ogr4uWNZkm
— Yosuke FURUKAWA (@yosuke_furukawa) May 11, 2015
execsyncsは使ってないけど、spawn-syncってモジュールを使おうとしたらダメでした。