田舎の技術者が奮闘中

php ruby node.js javascript などのスクリプト言語とサーバー(Chef、Vagrant)に関して書きます。

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を使用してみます。