node.js シングルスレッドの罠
引き続きnode.jsの話です。
node.jsはc10k問題を解決するために、開発されたと言われています。
簡単に言うと、今までの言語(PHP等)はたくさんアクセスがあるとそれだけプロセスが立ち上がって(マルチスレッド)、処理が追いつかないから最終的には止まっちゃうよ!ということです。
それを解決するために、一つのプロセスで(シングルスレッド)で処理を行なって、止まりにくいアプリケーションを構築出来るようにしたのがnode.jsということです。
そこでハマったのが・・・(というかシングルスレッドだったのを忘れてただけですけど・・・)
DB(AWSdynamoDB)にアクセスし、retrunでデータを返そうとすると、データが空で返ってきてずっとはまってました。
(使用ライブラリはdynodeってやつです)
function getUser(id){ var retrunData; dynode.getItem("ExampleTable", id, function(null, resp, etc){ returnData = resp; }); return returnData; } # 呼び出し元 console.log(getUser(id));
結局シングルスレッドで動作するのでcallback関数で値を返さないと、処理を待たずに走っちゃいます。ですのでreturnの値が空になってしまうと・・・
以下修正
function getUser(id, cb){ dynode.getItem("ExampleTable", id, function(null, resp, etc){ cb(resp); }); } # 呼び出し元 getUser(id, function(res){ console.log(res); });
マルチスレッドに慣れてしまって、全く考慮してませんでした。
いつもはjavascript等でAJAX処理する際callback関数で処理してるのに・・・
サーバーサイドのjavascriptは面白いですが、以外な罠があるので気をつけましょう。
今度、暇な時にjQueryのDeferredを使用してみます。