shinout.knowledge
(27 keywords)

最新日記

RSS
  • 日記はまだありません

しんのお気に入り

  • あきくもちゃのブック あきくもちゃのブック
  • usuyamaのブック usuyamaのブック
  • 西小倉事典 西小倉事典
  • 極秘ブック 極秘ブック

shinout.knowledgeのメンバー

  • 西小倉パンデイロ 西小倉パンデイロ
  • しん しん
  • なおき なおき
  • akki-ra akki-ra
 

Node.js

0pt

Node.jsがどういったことを解決しようとしたのかを、比喩を踏まえて自分なりの理解を書く。

一人で料理する


パスタを茹でる。
アサリの砂抜き。
野菜切る。

とかをやるとき、
アサリの砂抜きしてる間にパスタを茹でて野菜を切る、ということを
我々は普通にやるわけだ。

このとき、同時に3つのことが出来ているわけだ。
別にすごいことじゃない。

プログラムは非効率なことをしてる

サイトAに接続
サイトBに接続
サイトCに接続
単語を抽出してDBに保存

このとき、サイトAに接続しながらサイトBに接続、なんてことができたら、
相当楽になるよね。さっきの料理とおんなじ要領で。

でも、
connectSite("A")
connectSite("B")
connectSite("C")

こんな風に書いたら、普通はAのサイトに接続が完了して、
データを取得できてからBのサイトに接続しに行く。

これは、料理で言ったら
アサリの砂抜きが終わるまでアサリの入ったボールの前でじっと立っているようなものだ。
それはもったいない!

これはプログラムはテキストで書かれていて、
上から順に実行されるから、基本的にはしょうがないのだ。

複数の実行者を用意する


上から順にプログラムを読むとさっきみたいにアサリの砂抜きをじっと見守ることになるから、
「実行する人を増やそう!」とする考えが出る。

マルチスレッドというやつだ。
一人ひとりは砂抜きを見守ったり、レンジが終わるまでレンジの前に立っていたり、
パスタが茹で上がるまで張り付いているけれど、
そういう人がたくさんいれば、とにかく同時にいける。



複数人で料理すると...

たとえば家庭科の調理実習なんかでは複数人で料理したと思うんだけど、
ケーキに使う牛乳の量を誤ったツトムくんが、
本来飲む用にも残しておくべきところを全部使っちゃった、
なんていうこともあったと思う。
複数人で料理するのは大変なのだ。
みんながプロ並みのスキルを持っていたらうまくいくけど、
ヘマをしたときの取り返しのつかなさといったらないよね。

同じように、マルチスレッドのプログラムは、
うまいやつがうまく設計しないと、うまくいかないプログラムが発生する。

Aさんがロッカーに鍵をかけたが
Bさんがついその前にロッカーの中に金庫の鍵を入れていて、
Aさんが手を怪我してロッカーが開けれず治療費が金庫の中に入っていてお金が払えない、
みたいな事態になる。

一人で料理する効率の良さをプログラムで実現する


アサリの前で立ち続ける非効率なプログラム

  • >複数人を用意
  • > 複数人だとプログラムは難しい


という話だったけど、ここにきて
一番最初に書いた「一人で料理する」という行為が実にクールに思えてきたと思う。
一人で済むし余計な待ちかたもしないし。

これを実現するのがNode.jsだよ

全部にタイマーを設定

いつパスタの茹であがりを知るか。
タイマーでいい時間を設定して、それが鳴ったら湯切りをすればいいわけだ。
Node.jsは、
終わったらこれする、みたいなことを書ける。
各処理のタイマーが鳴った段階で、実行する処理を登録しておくのだ。

ゆでる(パスタ, 湯切る)
砂抜きをする(あさり, 水を捨てる)

こんな感じで、動詞を渡す。

connectSite(A, function(err, contents) {
});

サイトAを取得したあとに、これこれこうする、という処理を設定しておく。

こういうように、一人で料理を効率よくやる方法に近いかたちで処理できるのが、
Node.jsのやり方。
これをシングルスレッドの非同期処理とか言ってます。

プログラムで、待つ処理ってなんだ?

アサリの砂抜きは、待ってれば終わる。
でも野菜を切るのは常に手を動かして張り付いてなければ終わらない。
だから前者は待つ処理で後者は待たない処理だ。

プログラムで、待つ処理とはなんだろうか。
それはI/Oというやつで、
ネットワークにアクセスしたりハードディスクにアクセスしたりするときに発生する。
だから例えばファイルを読むというようなシンプルな処理をするときにも
Node.jsじゃない普通のプログラムは、アサリの前で待ってるわけだ。
だがまぁ人間ではとても誤差とは思えない驚くべき速さでファイルは読まれているから、
アサリなんかを比喩にするのはおかしい、とか思うかもしれない。

けど、メモリからデータを読むのとファイルからデータを読むのを比べると、
後者は100000倍も遅い。
これを聞くと、やっぱり従来型プログラムはアサリの前で待っていたのだ。


窓口を少数人でやる

窓口って言ったら基本は同時に対応できるお客さんは一人までだが、
お客さんが途中で家族と電話してなんか確認する、みたいなときに待ちが発生する。
その隙に他のお客さんに対応するという無礼な行為をすることによって、
より多くの人数がさばける。

サーバーというのもいわば窓口で、
通常これもマルチスレッド、マルチプロセスによって複数で対応する。
(マルチスレッドとマルチプロセスの違いは
マルチスレッドが窓口の裏側が繋がっている状態で、
マルチプロセスは窓口の裏側が別室で互いに連絡がとれないような状態だ)

人気のサービスではアクセスは大量に来るというのに
窓口の人数が足りないという状態が発生する。いわゆるC10K問題というやつだ。
こういうとき、「待ち」が発生した隙をみて別のアクセスに対応すれば、
効率よくさばける。
Node.jsは、サーバーとして用いるのに非常に優れている。

ということで

Node.jsは待ち時間を有効利用する優れたプログラム実行エンジンなのだ。

「Node.js」について友人に書いてもらう。

あなたにとって「Node.js」とは?

ログインするとワンクリックでキーワードを投稿できます

ログインする 新規登録する

お気に入りの説明

1 pt
正式名称は「node」だけどややこしいのでこう呼ぶ。 サーバサイドJS を動かす仕組みの一つ。 名前の由来 Nodeで書いたプログラムの1つがネットワークの一つのノードだから。 http://twitter.c...
もっと読む

他の人の「Node.js」を見る