非同期および単一スレッド-その他

1675 ワード

シングルスレッド
単一スレッドの実行順序は上から下へ順次実行され,同じ時間に1つのコードしか実行されない.JavaScriptはシングルスレッドですが、ブラウザ内部はシングルスレッドではありません.あなたのI/O操作、タイマのタイミング、イベントリスニング(click,keydown...)などは、ブラウザが提供する他のスレッドによって行われています.
マルチスレッドを使用して時間のかかるタスクを処理する場合は、HTML 5で提案されたWeb Workerを使用します.
1つのjsプログラムの単一スレッドはスタック内の同期タスクを実行するために使用され、すべての同期タスクが実行されると、スタックが空になり、タスクキュー内の処理対象タスクを読み出し、関連コールバック関数をスタックに押し込み、単一スレッドは新しい同期タスクを実行し始め、実行が完了します.
単一スレッドがタスクキューからタスクを読み出すのは絶えず循環し、スタックが空になるたびに、タスクキューから新しいタスクを読み出し、新しいタスクがなければ、新しいタスクがあるまで待機します.これをタスクループと呼びます.各タスクは1つのイベントによってトリガーされるため、イベントループとも呼ばれます.
非同期
ajaxでは、ページの単一スレッドがxhrを実行する.send()の後、ページにとって送信タスクは完了しました.
どのように送信するか、それはブラウザのことで、単線程とは関係ありません.いつ応答するか,このことははっきり言えない.
応答するコンテンツをタイムリーに得るためには、対応するイベントを単一スレッドに登録すればよい.onreadystatechange = fn() {...}.登録すると、ブラウザは内部の他のスレッドで自動的にイベントを傍受します.イベントがトリガーされるまで、ブラウザはタスクキューに単一スレッドの実行を待つタスクを追加します.
タイマ
settimeoutの役割は,一定時間間隔を置いてコールバック関数をタスクキューに挿入し,スタック内の同期タスクがすべて実行された後に実行することである.スタック内の同期タスクも時間がかかるため、間隔の時間は通常、指定した時間以上になります.
settimeout(fn,0)は、コールバック関数fnを直ちにタスクキューに挿入し、直ちに実行するのではなく、実行を待つことを意味する.例を見てみましょう
setTimeout(function() {
console.log("a")
}, 0)
for(let i=0; i<10000; i++) {}
console.log("b")
//   :b a

印刷結果は、コールバック関数がすぐに実行されるのではなく、スタック内のタスクが実行されるのを待っていることを示します.スタック内のタスクがどのくらい実行されるかは、どのくらい待たなければなりません.
ps:JavaScript単一スレッドとその非同期メカニズムは上述したとおりである.
単一スレッドとは孤独ではありません.その背後にはブラウザの他のスレッドがサービスしています.非同期でも、イベントの応答を他のスレッドで傍受し、コールバック関数をタスクキューに押し込んで実行を待たなければなりません.単一スレッドはスタック内の同期タスクを実行し、実行が完了したらタスクキューからイベントを取り出し(イベントがなければイベントを待つ)、スタックに関連する同期タスクを実行し、このようにループします.
参考資料:*同時モデルとEvent Loop
  • JavaScript実行メカニズム詳細:Event Loop
  • について
  • JavaScript非同期メカニズム