2
秒ごとにsetInterval
メソッドを持つJavaScriptコードについて話しましょう。
いくつかのコントロールのためのonblur
アニメーションイベントも持っています。
onblur
が発生する場合(+アニメーション)、setInterval
関数を取得する場合があります。
だから私の質問は:
非同期プログラミングはマルチスレッドを意味しますか?(何らかの意味で)?
Javascriptはマルチスレッド言語ではないことを知っています。
そう...?
いいえ、それは文字通りそれが意味することを意味します-非同期です。非同期プログラミングとスレッドベースのプログラミングの違いを理解することは、プログラマーとして成功するために重要です。
従来の非スレッド環境では、関数が外部イベント(ネットワークイベント、キーボードまたはマウスイベント、さらにはクロックイベントなど)で待機する必要がある場合、プログラムはでなければなりません。そのイベントが発生するまで待機。
マルチスレッド環境では、プログラミングの個々のスレッドの多くが同時に実行されます。 (CPUの数とオペレーティングシステムのサポートによっては、これは文字通り正しい場合もあれば、高度なスケジューリングアルゴリズムによって作成された幻想である場合もあります)。このため、マルチスレッド環境は困難であり、スレッドが互いにオーバーランしないように互いのメモリをロックする問題が発生します。
非同期環境では、単一のプロセススレッドが常に実行されますが、イベント駆動型の理由(そしてそれが重要)により、ある機能から別の機能に切り替わることがあります。イベントが発生すると、現在実行中のプロセスが別のイベントを待機する必要があるポイントに到達すると、JavaScriptコアはイベントのリストをスキャンしますそして、次のイベントを(正式には)不確定(ただしおそらく確定的)な順序でイベントマネージャに配信します。
このため、イベント駆動型の非同期プログラミングは、メモリの競合問題など、従来のマルチスレッドプログラミングの多くの落とし穴を回避します。イベントが処理される順序はあなた次第ではないため、依然として競合状態が存在する可能性がありますが、それらはまれであり、管理が容易です。一方、現在実行中の関数がアイドルスポットに到達するまでイベントハンドラーはイベントを配信しないため、一部の関数はプログラミングの残りの部分を枯渇させる可能性があります。これはNode.jsで発生します。たとえば、サーバーで馬鹿げて大量の計算を大量に実行すると、小さなサーバーに押し込まれ、ノードが「待機」して回答を送信するのが最適です。 Node.jsは、イベント用の優れた小さなスイッチボードですが、100ミリ秒より長い時間がかかるものはすべて、クライアント/サーバーの方法で処理する必要があります。
ブラウザー環境では、DOMイベントは自動イベントポイントとして扱われます(そうする必要があります。DOMを変更すると、多くのイベントが配信されます)。ただし、JavaScriptが不適切な場合でも、コアが不足する可能性があるため、FirefoxとChromeこれらの「このスクリプトは応答を停止しました」割り込みハンドラーがあります。
シングルスレッドイベントループは、シングルスレッド言語で非同期であることの良い例です。
ここでの概念は、doLater
コールバックハンドラーをeventLoop
にアタッチすることです。その場合、eventLoop
は、各doLater
ハンドラーの特定のタイムスタンプが満たされているかどうかをチェックし、満たされている場合はハンドラーを呼び出すwhile(true)
です。
興味のある方のために、JavaScriptの 単一スレッドイベントループの素朴な(そして恐ろしく非効率的なおもちゃ)実装を次に示します
これは、シングルスレッドへのOSスレッドスケジューラのアクセスがない場合、doLater
コールバックでビジー待機を強いられることを意味します。
sleep
呼び出しがある場合は、次のsleep
ハンドラまでdoLater
を実行できます。これは、単一のスレッドをスケジュール解除してOSに実行させるため、ビジー待機よりも効率的です他のもの。
コードを無計画に実行し、競合状態のリスクを冒すという意味でのみ。タイムアウトと間隔を使用しても、パフォーマンス上の利点は得られません。
ただし、HTML5のWebWorkersでは、ブラウザーで実際のマルチスレッドを使用できます。 http://www.html5rocks.com/en/tutorials/workers/basics/