Node.js Advent Calendar 2013 11日目です。昨日はnazomikanさんのjadeを知る - 株式会社ネクスト エンジニアBlogでした。
さっちゃんはHamlよりもERB (erubis) を使い、SassよりもScssを使ふ人間ですが、node.jsではいちおうjadeです。あ、此れがjade + lessで書いてます。
Node.jsの問題点、デメリットと解決方法まとめ - Qiita [キータ]でわたしのnode.jsでCPUを使う重い処理のlibrary (child process使い) を1 fileで作るが取り上げられてゐるが、わたしの記事には重大な欠陥が有り、書いた直後に気附いたにも関らず修正してゐません。
- dataの変換
- 送信時間
送受信するdata量が多い場合に問題に成ります。node.jsのChild Processに限らず、Web WorkerやFlashとのやりとりでも或る程度は同じ筈です。
dataの変換
child_process.send(message, [sendHandle])
はsocketを送る事もできて、其の時はいいですが、messageとしてobjectを送るときは、其のobjectは文字列に変換されて送信されます。文字列として送られます。此れはdata量が多い場合に問題に成り得ます。高速化しやうと思ってTypedArrayとか使ってると、TypedArray -> Array -> Stringの変換に凄く時間が掛かって、Arrayで計算してるのよりも遅く成ったりします。
必ず。実測しませう。
送信時間
送受信に時間が掛かると云ふ話しではありません。まあ其れも有るので、其の計算が洞れ丈CPUをblockingしてゐるのかは実測しませう。機械向けの最適化に、論理の正確な実測は必須です。programming言語は人間の論理の為のものです。
ところでですね、childのnode.jsが終了するんですよ。送信が終わる前に終了して、parentがdataを受け取れないんですよ。此れは大問題です。
幾つか対処法が有ります。
- dataを細切れに送る。: スゴイ本末転倒感有りますが、dataを細切れに送れば或る程度は受け取れます。意外と受け取れます。一部は、矢張り送信前にchildが終了するので、dataが欠けてもいい場合は選択肢に挙がります。
- parentで受信終了を検知する。: childは送信後待たせて起こしっぱなしにしておいて、parantで終了を検知し、
child_process.disconnect()
で落とします。ちゃんとtime outも実装してください。child_process.send() でparentからchildに終了命令messageを送るのは駄目です。高頻度でerrorで落ちます。
まあMB級のdataを投げてゐたので此う成りました。生成されるdata量がまともな場合、何も困りません。普通にchild側でprocess.exit()
させてあげてください。
明日はShigeki Ohtsuさんです。