JavaScript-イベント駆動型および並行性の問題?
-
25-09-2019 - |
質問
ご挨拶、
私はJavaScript、nodejsを勉強しています。そして、JavaScriptで並行性の問題がどのように回避されるかを理解していません。
私がオブジェクトに取り組んでいるとしましょう
var bigObject = new BigObject();
そして、私は持っています setTimer(function(){ workOnBigOjbect...} )
それも取り組みます bigOjbect
.
ディスクIOが書かれている場合 bigObject
, 、および作業するタイマーオブジェクト bigObject
, 、そして定期的に読み取りをコードします bigObject
, 、並行性の問題はどのように回避されますか?
通常の言語では、ミューテックスまたはスレッドセーフキュー/コマンドパターンを使用します。また、JavaScriptの人種条件についてはあまり議論していません。
私は何かが足りませんか?
解決
node.jsの全体的なポイントは、イベント駆動型であるということです。すべてのコードは、1つのスレッドでイベントハンドラーで実行されます。コードが同時に実行されないため、並行性の問題はありません。欠点は、各イベントハンドラーが他のイベントをブロックするため、迅速に終了する必要があることです。
例では、コードはディスクIOを開始し、すぐに終了します。 node.jsインフラストラクチャは、イベントハンドラーを実行することでIO操作が完了したことをプログラムに通知します。タイマーイベントは、IOイベントの前または後に呼び出されますが、同時に呼び出されません。
他のヒント
JavaScriptはシングルスレッドです。関数が実行されることになっているときに(Settimerと呼ばれる方法に基づいて)時間が到来し、親コードがまだ実行されている場合、親コードが完了するまで機能は実行されません。
単一のスレッドのみがあります。見る: マルチコアマシンのnode.js
これは、一般的にJavaScriptがブラウザ内で実行され(Windowsケースでは単一のUIスレッドのみがある)、複数のスレッドをサポートしていないため、基礎となるV8 JavaScriptエンジンで複数のスレッドがサポートされていないためだと推測します。
JavaScriptと呼ばれるこのことがあります 実行と完了 これにより、コードが実行されている場合、他の(非同期)コードが実行される前に完全に実行されることが保証されます。したがって、並行性の問題はありません。
例の場合、タイマーコールバックが呼び出された場合はいつでも完全に実行され、他のコードを実行するために中央で先制されることはありません。
見る JavaScriptに並行性制御ツールがない理由 詳細については。