Node v0.7.0の新機能Isolates(マルチスレッド)を試す

たまたま新環境にNode.js入れてたらv0.7.0がリリースされてたのに気がついたので、勢いで新機能を試してみた。


V8のバージョンが上がったとかもあるけど多分一番の目玉はIsolates(マルチスレッド)のサポートかな、と思う。開発ブランチでは他にもDomainsという機能も実装中らしいと聞いてたがそれはまだv0.7.0では使えないようだ。
Isolatesの使い方がドキュメントの方には載ってなかったのでソースをisolateとかthreadとかで探してみたところ、どうやらchild_processモジュールのspawnやforkのオプションに thread:true を渡してやればマルチスレッドを使ってくれるっぽいことが分かった。

シングルスレッドと非同期I/Oでシンプル&ハイパフォーマンスが売りのNodeだが、よく「マルチコアが使い切れない、重たいCPU処理したら固まるじゃんプギャー」って批判されてしまっていたのも事実。今回のIsolatesによりその弱点もカバー出来るね、やった!

サンプルコード

process.features にも isolates:true なんて値が増えてたのでそれを使ってマルチプロセスとマルチスレッドの切り分けをして、両方の動作を確認するコードを書いてみた。
前半がマルチスレッド用で、後半がマルチプロセス用。

実行結果

v0.6.7とv0.7.0の両方で実行してみると出力結果はこんな感じ。
Isolates有効な方は単一プロセスIDの複数スレッドIDで動いてて、Isolates無効な場合は複数プロセスが作成されているのが分かる。

プロセスツリー

折角マルチスレッドなんだからプロセスツリーがどうなってるかも確認してみた。
当然っちゃ当然だが、Isolates有効な方は無駄なプロセスが出来ること無く動いてることが確認できた。

追記(2012-02-05) Isolateの組み込みは一旦取りやめに

先日NodeのリーダーがRyanからIsaacになったというニュースがありましたが、そのIsaacさんのPOSTによると、どうもIsolateはまだまだ不安定で内部も複雑になってしまう為これに注力しても労力の割に得るものは少ないとの判断で、一旦これを取りやめ、代わりに Domains 機能に力をいれるそうです。
ただ、Isolatesを諦めたわけではなく優先順位の変化なだけで将来的にNodeに組み込まれる予定は変わらないっぽい、ただそれが次のメジャーバージョンであるv0.8.0の時ではなくなったということのようです。

まぁ、機能的にはIsolatesはマルチプロセスのforkで代替できるし、正直Domains機能のほうが面白そうなので全く問題なし。


追記(2012-02-08) 予告通りv0.7.3で消えたね

http://blog.nodejs.org/2012/02/07/node-v0-7-3/