アイドル状態

アイドル期間 (Web)

[24] イベントループは、特に実行できるタスクのないアイドル状態となることがあります。 requestIdleCallbackコールバック関数が登録されている場合、 アイドル期間が設定され、コールバック関数が実行されます。

仕様書

イベントループのアイドル状態

[2] 利用者エージェントは、イベントループイベントループに関して、 十分な時間 (a non-trivial amount of time) アイドル (idle) であり続けそうだと思われる場合であって、 他のイベントループその他のより優先度の高い作業に悪影響を及ぼさないと考えられる場合には、 イベントループの新しいアイドル期間を開始するべきです >>1

[3] 利用者エージェントは、電力消費の節約のために文書隠れている場合にアイドル期間を開始する頻度を下げる >>1 など、 適当に調整できます。

[25] アイドルとはどのような状態なのかはあまり厳密には定義されていませんが、 イベントループですぐに実行可能な状態のタスクタスクキューに見当たらないことを表しているようです。

[26] ネットワーク待ちの fetch や、時間経過待ちの setTimeout の処理があっても、すぐに実行可能なタスクではありませんから、 アイドル状態となり得ます。


[4] イベントループアイドル期間開始アルゴリズム (start an idle period algorithm) は、 次のようにしなければなりません >>1

  1. [5] 最終締切を、イベントループ最終アイドル期間締切に設定します。
  2. [7] を、現在時刻に設定します。
  3. [8] 最終締切 > なら、
    1. [9] ここで停止します。
  4. [10] 締切を、より大きな適切な値に設定します。 締切は、アイドル状態であり続けると予想される時刻としますが、 + 50 ms 以下とします。
  5. [11] 文書群を、イベントループに関連付けられた文書のうち、 完全に活性なもののリストに設定します。
  6. [12] 文書群の各文書について、
    1. [13] 文書Windowアイドル要求コールバック群のリストの各項目を、 そのままの順序で、 文書Window走らせられるアイドルコールバック群のリストの末尾に追加します。
    2. [14] 文書Windowアイドル要求コールバック群のリストを、 空にします。
  7. [15] タスクをキューに追加します。
    処理
    1. [16] イベントループ締切について、 アイドルコールバック群の呼び出しアルゴリズムを実行します。
    タスク源
    アイドルタスクタスク源
  8. [17] イベントループ最終アイドル期間締切を、締切に設定します。

[6] イベントループは、 最終アイドル期間締切 (last idle period deadline) を持ちます。 初期値は 0 です。 >>1

[20] 締切は、利用者エージェントが任意の基準で決定できます。 requestIdleCallbackコールバックの実行で、 他の時間に厳しいタスクが遅延してしまわないように注意する必要があります。 そのため、次の最小値とするべきです >>1

[18] アイドル期間 (idle period) とは、 から締切までをいいます。 イベントループアイドル期間は、同時に複数開始することはできません。 >>1

[29] アイドル期間開始アルゴリズムは、イベントループから呼び出されます。

[19] 利用者エージェントは、途中でアイドル状態でなくなったと判断したら、 締切を待たずにアイドル期間を打ち切ることもできます。 その場合であっても、締切まで次のアイドル期間は開始できません。 >>1

関連

[217] ワーカーprotected worker でなくなるとは、 このアイドル状態に近いものを指しているようです (ワーカーの性質により、 本項での説明とは異なる点もあります)。

[27] アイドル状態busy indicator が停止している状態は一致しません。

メモ

[130] ブラウザー拡張埋め込みブラウザー、他のアプリケーションから Webブラウザーを制御する API などは、 Webページの読み込みが終わり 「安定」した状態 (idle 状態) になったことを検知したい場合があります。

[131] 例えば Webページの表示が完了したらスクリーンショットを撮るソフトウェアの実装には、表示の完了のタイミングを知る必要があります。ここでいう表示の完了は、 必ずしも completely loaded ではなく、読み込み完了後に遅延して実行されるスクリプトの完了も待ちたいです。

[132] Webアプリケーションテストのために外部から Webブラウザーを制御する場合、 クリックなどの入出力操作を擬似的に発生させ、それに対するスクリプトの一連の動作が終わったら、 その時点の状態を確認したいかもしれません。

[133] この状態は仕様上の概念ではありませんから (Webサイト相互運用性には影響しません)、 判断方法はそれぞれの実装によります。一般的には、次のように判断するのが妥当でしょう。

[177] 媒体再生アニメーションワーカーの実行、 EventSourceWebSocket などは、 無視するのが適当そうです。

[193] 無限に読み込みが続く場合やスクリプトによりアニメーションする場合など、 この定義の「アイドル状態」に至らないこともあり得ます。

[28] Integrate with requestIdleCallback (rmcilroy著, ) https://github.com/whatwg/html/commit/01787ee712a7803e64e0da6ac9644a5e6b8d2cca

[30] Missing definition for "idle time" · Issue #70 · w3c/requestidlecallback () https://github.com/w3c/requestidlecallback/issues/70

[31] Hook into HTML spec. by rmcilroy · Pull Request #75 · w3c/requestidlecallback () https://github.com/w3c/requestidlecallback/pull/75

[32] Integrate with requestIdleCallback by domenic · Pull Request #3570 · whatwg/html () https://github.com/whatwg/html/pull/3570

[33] Integrate with requestIdleCallback by rmcilroy · Pull Request #4104 · whatwg/html () https://github.com/whatwg/html/pull/4104