並列

並列実行 (Web)

[2] 元のアルゴリズムやその実行元とは別のアルゴリズムを同時に実行させることを並列で (in parallel) の実行といいます。

仕様書

動作

[3] あるアルゴリズム並列に実行するという時、そのアルゴリズムの手順はイベントループなど他の処理と同時に動作することを表しています。 >>1

[4] その実装方法は例えばプロセスを分離したりスレッドを使ったり、 時分割協調マルチタスクとしたりと色々と考えられますが、 仕様上は特に限定されていません >>1

キュー

[30] 並列キュー (parallel queue) は、 並列に実行されるアルゴリズム同士の競合を避けるために用いられるキューです >>1

[32] 共有ワーカー管理器で使われています。

[31] 並列に実行されるもののすべてが並列キューを用いるわけではありません。

[33] 並列キューは、 キューであるアルゴリズムキュー (algorithm queue) を持ちます。 初期状態はです。 >>1

[36] 新しい並列キューを開始 (start a new parallel queue) するには、 次のようにします。 >>1

  1. [37] 並列キューを、新しい並列キューに設定します。
  2. [43] 並列キューを返します。

[38] そして並列に、次のようにします。 >>1

  1. [39] 繰り返し、
    1. [40] 手順群を、並列キューアルゴリズムキューから dequeue した結果に設定します。
    2. [41] 手順群が存在する場合、
      1. [42] 手順群を実行します。
[44] 共有ワーカー管理器が呼び出します。

[34] 並列キューキュー手順群をキューに追加 (enqueue steps) するには、 手順群について、次のようにします。 >>1

  1. [35] キューアルゴリズムキューについて、手順群キューに追加します。

並列に動作するアルゴリズム

[5] Webブラウザー上で並列に動作するアルゴリズムには、次のものがあります。

[6] イベントループ自体は並列に動作するとは明記されていませんが、 常時動作するとの要件を満たすためには相互に並列に動作させるしかありません。

[7] ワーカーイベントループrun a worker から呼び出されますが、 このアルゴリズムは新しい並列な実行環境を作成するものです。

[8] 次に示すアルゴリズムの一部または全部は仕様書上「並列 (in parallel) 」 と明記されており、それぞれ並列に実行されます。

[9] これらの一部は同期区間をも有しています。
[10] HTML Standard では「in the background」とも記述されていることがありますが、 いずれも in parallel と併用されています。

[13] 次に示すアルゴリズムの一部または全部は仕様書上 「非同期的に (asynchronously) 」 実行すると規定されており、それぞれ並列に実行されます。

[12] HTML Standard で「asynchronously」と記述されていた箇所は明確化のためすべて in parallel に置き換えられました >>11, >>16>>13 のアルゴリズムはそれ以前に HTML Standard の作法を真似たものの、追随していないものです。

[18] 受動的イベントリスナーしかない場合に、 利用者エージェントイベントを含む処理を並列に実行することで最適化できるかもしれません >>19

受動的リスナーの項も参照。

[22] 入出力の装置の処理も、並列に行われます。

[23] 例えばマウス操作プラットフォームから随時受け取って、 適当なイベントループタスクを追加する必要があります。

[24] 例えば再生中の動画を処理して、適宜 (イベントループ内のレンダリングの更新とは別に) 画面描画に反映させる必要がある場合もあります。

[25] 例えばストレージへの実際の書き込みを遅延させている場合、 タスク完了後、並列にプラットフォームに書き込み指示を引き渡す必要があります。

[21] 標準化の範囲外なので仕様書には明記されていませんが、 この他に、Webブラウザー利用者インターフェイスに関わる処理も並列に実行する必要があります。

通信

[14] いくつかのアルゴリズムでは同期区間という形でイベントループとの同期待ちが行われます。

[15] 実際には並列に実行される手続きの最後でマイクロタスクを追加するという形で実装されているかもしれません。

[105] ApplicationCacheabort メソッド裏で動いている (in the background) 処理に対して信号を送信 (send a signal) します。

停止

[72] あるアルゴリズムが同時に実行中の他のアルゴリズム停止 (abort) させることがあります。

歴史

[20] Add EventListenerOptions and passive event listener feature · whatwg/dom@253a21b ( 版) <https://github.com/whatwg/dom/commit/253a21b8e78e37447c47983916a7cf39c4f6a3c5>

[26] Make navigate use "in parallel" · whatwg/html@77b1e02 ( 版) <https://github.com/whatwg/html/commit/77b1e021bcb9229c60fc90dc72bbb0e0d1cff7e4>

[27] refactor: install steps (#485) (marcoscaceres著, ) <https://github.com/w3c/manifest/commit/e0906abde1fa4286526ecf866ee59856e3914716>

[28] "fetch a single module script" needs to post a task back to the main thread · Issue #2202 · whatwg/html () <https://github.com/whatwg/html/issues/2202>

[29] Make shared worker creation deterministic (jakearchibald著, ) <https://github.com/whatwg/html/commit/9fda90f44c7c9223de6e3755a043f67ea7c92bf5>

[45] Introduce a concept named threads to better describe concurrency · Issue #1843 · whatwg/html () <https://github.com/whatwg/html/issues/1843>

[46] Adding a method to queue particular "in parallel" steps. by jakearchibald · Pull Request #3038 · whatwg/html () <https://github.com/whatwg/html/pull/3038>

[47] Adding a method to queue particular "in parallel" steps. by jakearchibald · Pull Request #3038 · whatwg/html () <https://github.com/whatwg/html/pull/3038>

[48] Parallel queues by jakearchibald · Pull Request #53 · WICG/background-fetch () <https://github.com/WICG/background-fetch/pull/53>

[49] Editorial: less continue after returning (annevk著, ) <https://github.com/whatwg/html/commit/0d097af1acbeabe56a1b0d0c2e2f521eca4defa8>

[50] "Return the new EventSource object, but continue..." · Issue #692 · whatwg/html () <https://github.com/whatwg/html/issues/692>

[51] Editorial: less continue after returning by annevk · Pull Request #3385 · whatwg/html () <https://github.com/whatwg/html/pull/3385>

[52] Editorial: no more "return, but continue" for <input type=file> (annevk著, ) <https://github.com/whatwg/html/commit/b2fc1c1d49ad5701b4bdcf80dcee115c3167005e>

[53] Editorial: no more "return, but continue" for <input type=file> by annevk · Pull Request #3388 · whatwg/html () <https://github.com/whatwg/html/pull/3388>

[54] Editorial: rewrite createImageBitmap() (annevk著, ) <https://github.com/whatwg/html/commit/5b40420b83dad83e5e566de9581dc51e4e4ee6cd>

[55] Editorial: rewrite createImageBitmap() by annevk · Pull Request #3389 · whatwg/html () <https://github.com/whatwg/html/pull/3389>

[56] Editorial: "return, but continue" cleanup for downloads and Worker (annevk著, ) <https://github.com/whatwg/html/commit/0217e1d4cb1ace836f6ef72a402b643aa879fbed>

[57] Editorial: "return, but continue" cleanup for downloads and Worker by annevk · Pull Request #3397 · whatwg/html () <https://github.com/whatwg/html/pull/3397>

[58] Clarify that objects created during pipeTo() are not observable (domenic著, ) <https://github.com/whatwg/streams/commit/7b8dffe8ec270bb918340e011349e2c1b5521a15>

[59] Clarify realm and task-queuing situation in pipeTo() by domenic · Pull Request #902 · whatwg/streams () <https://github.com/whatwg/streams/pull/902>