web-dev-qa-db-ja.com

nodejsの並行性のモデル

Nodejsのメモリモデルとスレッドモデルを知っている人はいますか?

特に、はii++アトミック? iivolatile in Java 1.5、in Java 1.4、Cで、またはそうでないかのように動作しますか?すべて?

29
OrangeDog

ノードとV8がどのように相互作用するかを理解することは有用です。 NodeオペレーティングシステムからのI/Oまたはタイマーの待機を処理します。ノードがI/Oまたはタイマーからウェイクアップすると、通常、呼び出すJavaScriptコールバックがいくつかあります。ノードがこれらのコールバックを実行すると、 V8がノードに戻るまで、制御はV8に渡されます。

したがって、_var ii = 1; ii++;_を実行すると、iiが2以外のものであることがわかりません。すべてのJavaScriptは完了するまで実行され、その後、制御がノードに戻されます。 doSomething(); doSomething();を実行すると、常にdoSomethingが2回実行され、doSomethingの2回目の呼び出しが返されるまでノードのイベントループに戻りません。これは、次のような単純なエラーからノードを完全にロックできることを意味します。

_for (var i=0 ; i >= 0 ; i++) {}
_

登録したI/Oコールバックの数、タイマーがオフに設定されているか、ソケットが読み取られるのを待っているかは関係ありません。 V8がその無限ループから戻るまで、ノードはそれ以上機能しません。

これは、ノードでのプログラミングを非常に優れたものにしている理由の一部です。ロックについて心配する必要はありません。競合状態やクリティカルセクションはありません。 JavaScriptコードが実行されるスレッドは1つだけです。

39
Matt Ranney

スレッド(イベントループ)は1つだけであり、I/Oなどの非同期アクションを実行しない限り、コードが中断されることはありません。並列コード実行はできません。したがってii ++はアトミックです

13
alienhard

Node.jsで非同期であるものとそうでないものを説明する良い記事は node.jsイベントループを理解する です。アプリケーションに非同期動作がある場所とない場所を特定できることを理解できれば。これを理解することで、必要なときにシーケンシャルコードを明示的に記述できます。 EventEmittersが重要です。

シングルスレッド性は、node.jsが高性能でスケーラブルであるという考えと矛盾しているように思われるので、これを見てください マルチコアに関するYahooの記事

4
Michael Dillon