Node.jsでストリームをパイプに繋いで生じた疑問と学んだこと
背景
数年前にWebSocketベースで疑似テザリングをするシステムを開発した。当時は無我夢中でSocket.ioのAPI叩き、コードを書いていた状態でnode.jsでのStreamの扱いまで意識が向いていなかった。
先日の「以前やったNode.jsで顔検出を改良した」の記事では、検出した顔をPNGファイルにするAPIがStreamベースのものであった。対象の画像によっては、1つの画像ファイルで顔が複数箇所検出されるケースもあり、同時実行数を制御する為に、これらの検出された複数の顔のPNGファイルへの書き込みの完了を検出する必要があった。つまり、Streamへの書き込み完了の検出方法を知る必要があった。
Streamを扱うコードを通して生じた疑問と答え
数年前にSocket.ioで疑似テザリングシステムを作成した際に、なんとなく、Node.jsでのStreamはendっていうイベントでStreamのおわりを処理出来た覚えがあった。
読み込み可能なStreamを読み切ったらどうなる
endイベントが呼ばれる。
reader.on("end",function() {console.log("読み込み完了!");});
書き込み可能なStreamの書き込みの終了はどうやって知るのか
書き込みを終了するにはendを呼ぶ。これが完了するとfinishイベントが呼ばれる。
writer.end("書き込みココまで\n"); writer.on("finish",function(){console.log("書き込み完了!");});
じゃぁ、パイプに繋いだやつは?
pipeにはオプションがあり、デフォルトだと読み込み完了したら、書き込みを終了する。
引数で指定した書き込み可能なStreamにfinishイベントが通知される。
デフォルトでpipeしてる分には
- 読み込み用ストリームの終了は意識しなくてOK
- 書き込みの完了は、書き込み用ストリームのfinishイベントで受け取れる。
まとめ
APIのオプション引数の説明に重要なことが記述されていることもあることが分かった。今回のケースではpipeメソッドのオプションの
options Object Pipe options end Boolean End the writer when the reader ends. Default = true
という記述の部分。
関連投稿
Link
- Stream Node.js v0.10.33 Manual & Documentation
- Node.js の Stream API で「データの流れ」を扱う方法 - Block Rockin’ Codes
- ストリーム表現とその変換 - ✘╹◡╹✘