LoginSignup
12
12

More than 5 years have passed since last update.

node.jsで子プロセスを起動しまくってエラーにならないようにするモジュール

Last updated at Posted at 2015-05-12

spawn-limit というモジュールを作りました。node.jsのchild_process.spawn()の薄いラッパーで、通常のspawnはChildProcessオブジェクトを返して、そいつに色々イベント登録して・・・という使い方をするんですが、プロセスを起動したらthenが呼ばれるPromiseを返すモジュールです。

ブラウザでサーバ間通信のコールバックの管理をPromiseでやるのは問題になることはないと思います。ネイティブのレイヤーで同時通信数を絞ってくれるので、アプリレイヤーで細かいことを考える必要はないでしょう。

今回はnode.jsで外部プロセスを起動しまくるコードを書いたら、プロセス数制限に引っかかって死という状況で、コードをちまちま直すのも辛かったし、呼び出し個所も複数にわたっていて、一箇所で制限するのもできなかったので、spawnそのものの数を絞るという方向でライブラリを作りました。方向性としては↓これのプロセス版ですね。プロセス数の制限数以上にspawnしようとすると、起動中のプロセス数が減るまでは起動を遅延させます。

基本的に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でも安心ですね!

最後にムカつく会長のツイートも張っておきますね☆

execsyncsは使ってないけど、spawn-syncってモジュールを使おうとしたらダメでした。

12
12
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
12