ホームページ >ウェブフロントエンド >jsチュートリアル >JavaScriptにおけるイベントループの解析
この記事の内容はJavaScriptのイベントループの解析に関するものであり、一定の参考価値がありますので、困っている方は参考にしていただければ幸いです。
イベント ループとは何ですか?
公式サイトの説明
私の個人的な理解では、jsのシングルスレッドとは、タスクスタックはシングルスレッドですが、非同期処理を行うということです。 i/o この方法は、処理のためにスレッド プールを開くために libuv に依存することです。完了後、タスクはポーリング キューに追加され、タスク スタックが空になるか、イベントがしきい値に達すると、ポーリング キューとタイマーが追加されます。タスクはタスク スタックに追加され、このループを継続します。これは通常、js のイベント ループです。
構造
┌───────────────────────────┐ ┌─>│ timers │ │ └─────────────┬─────────────┘ │ ┌─────────────┴─────────────┐ │ │ pending callbacks │ │ └─────────────┬─────────────┘ │ ┌─────────────┴─────────────┐ │ │ idle, prepare │ │ └─────────────┬─────────────┘ ┌───────────────┐ │ ┌─────────────┴─────────────┐ │ incoming: │ │ │ poll │<p><strong>timer:</strong><br> スケジュールされたタスクがしきい値に達しても、すぐには実行されず、そのタスクを待機しているタスクによってブロックされます。スタック。 </p><p><strong>保留中のコールバック: </strong><br> このステージでは、特定のシステム操作 (TCP エラー タイプなど) のコールバックを実行します。たとえば、一部の *nix システムは、接続しようとしているときに TCP ソケットを受信した場合、エラーを報告するまで待機する必要があります。これは、保留中のコールバック フェーズで実行するためにキューに入れられます。 </p><p><strong>pull:</strong> <br>このステージには 2 つの主な機能があります: <br> I/O をブロックしてポーリングする時間を計算し、次に <br> ポーリング キュー イベントを処理します。 。 <br> イベント ループがポーリング フェーズに入り、タイマーがスケジュールされていない場合、次の 2 つのうちのいずれかが起こります。 </p><p> ポーリング キューが空でない場合、イベント ループはそれを横断し、それらを同期的に実行します。キューが使い果たされるか、システム依存のハード制限に達するまでコールバックされます。 </p><p>ポーリング キューが空の場合、次の 2 つのうちの 1 つが起こります。 </p><p>スクリプトが setImmediate を実行した場合、イベント ループはポーリング フェーズを終了し、チェック フェーズに進み、これらを実行します。スケジュールスクリプト。 </p><p>スクリプトが setImmediate を実行しない場合、イベント ループはコールバックがポーリング キューに追加されるのを待機し、すぐに実行します。 </p><p>ポーリング キューが空になると、イベント ループがタイマーをチェックします。1 つ以上のタイマーの準備ができている場合、イベント ループはタイマー フェーズに戻り、それらのタイマーのコールバックを実行します。 </p><p><strong>check</strong> <br>このフェーズでは、ポーリング フェーズが完了した直後にコールバックを実行できます。ポーリング フェーズがアイドル状態になり、setImmediate タスクがある場合、イベント ループはコールバックの追加を待つポーリング フェーズでブロックするのではなく、直接ジャンプして実行を確認します。 </p><p>setImmediate は実際には、イベント ループの別のステージで実行される特別なタイマーです。 libuv API を使用して、ポーリング フェーズの完了後に実行されるコールバックをスケジュールします。 </p><p><strong>close コールバック</strong></p><p>ソケットまたはハンドルが突然閉じられた場合 (socket.destroy() など)、この段階で「close」イベントが発行されます。それ以外の場合は、process.nextTick() によって出力されます。 </p><p>この記事はここで終了しました。その他のエキサイティングなコンテンツについては、PHP 中国語 Web サイトの <a href="http://www.php.cn/course/list/17.html" target="_blank">JavaScript ビデオ チュートリアル</a> 列に注目してください。 </p><p><br></p><p> </p>
以上がJavaScriptにおけるイベントループの解析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。