/
662.txt
179 lines (140 loc) · 9.33 KB
/
662.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
[2] 元の[[アルゴリズム]]やその実行元とは別の[[アルゴリズム]]を同時に実行させることを[DFN[[RUBYB[並列で]@en[in parallel]]]]の実行といいます。
* 仕様書
[REFS[
- [1] '''[CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2014-09-19 23:39:59 +09:00]] 版) <https://html.spec.whatwg.org/#in-parallel>'''
- [19] [CITE@en[DOM Standard]] ([TIME[2016-02-12 01:13:05 +09:00]] 版) <https://dom.spec.whatwg.org/#observing-event-listeners>
]REFS]
* 動作
[3] ある[[アルゴリズム]]が[[並列]]に実行するという時、その[[アルゴリズム]]の手順は[[イベントループ]]など他の処理と同時に動作することを表しています。 [SRC[>>1]]
[4] その実装方法は例えば[[プロセス]]を分離したり[[スレッド]]を使ったり、
[[時分割]]の[[協調マルチタスク]]としたりと色々と考えられますが、
仕様上は特に限定されていません [SRC[>>1]]。
* 並列に動作するアルゴリズム
[5] [[Webブラウザー]]上で[[並列]]に動作する[[アルゴリズム]]には、次のものがあります。
[FIG(short list)[
- メインの[[イベントループ]]
- [[ワーカー]]の[[イベントループ]]
]FIG]
[6] [[イベントループ]]自体は[[並列]]に動作するとは明記されていませんが、
常時動作するとの要件を満たすためには相互に[[並列]]に動作させるしかありません。
[7] [[ワーカー]]の[[イベントループ]]は [[run a worker]] から呼び出されますが、
この[[アルゴリズム]]は新しい[[並列]]な実行環境を作成するものです。
[8] 次に示す[[アルゴリズム]]の一部または全部は仕様書上「[RUBYB[[[並列]]で]@en[in parallel]]」
と明記されており、それぞれ[[並列]]に実行されます。
[FIG(short list)[
- [[スピン]]
- [[セッション履歴イベントループ]]
- [[fetch]] に関わるいくつかのアルゴリズム
- [CODE(JS)@en[[[document.load]]]]
- [CODE(HTMLe)@en[[[canvas]]]] の [CODE(DOMm)@en[[[toBlob]]]]
- [[downloading hyperlinks]]
- [[application cache download process]]
- [CODE(DOMm)@en[[[setTimeout]]]]、[CODE(DOMm)@en[[[setInterval]]]]
- [CODE(JS)@en[[[new]] [[Worker]]]]
- [CODE(JS)@en[[[new]] [[SharedWorker]]]]
- [CODE(DOMi)@en[[[EventSource]]]] の [[reestablish the connection]]
- [CODE(HTMLa)@en[[[ping]]]]
- [[favicon]]
- [CODE(JS)@en[[[new]] [[EventSource]]]]
- [CODE(JS)@en[[[new]] [[WebSocket]]]]
- [CODE(JS)@en[[[new]] [[Notification]]]] [SRC[[[Notifications API]]]]
- [[cache failure steps]]
- [[kill a worker]]
- [[terminate a worker]]
- [CODE(HTML)@en[[[<input type=file>]]]] の [CODE(DOMm)@en[[[click]]]]
- [CODE(DOMm)@en[[[createImageBitmap]]]]
- [[update the image data]]
- [[navigate]]
- [[handle fetch]]
- [[サービスワーカー登録]]
- [[ジョブを走らせる]]
- [CODE[img.decode]]
[HISTORY[
- [CODE(DOMm)@en[requestAutocomplete]]
- [CODE(DOMm)@en[[[postMessage]]]]
]HISTORY]
]FIG]
;; [9] これらの一部は[[同期区間]]をも有しています。
;; [10] [[HTML Standard]] では「in the background」とも記述されていることがありますが、
いずれも [[in parallel]] と併用されています。
[13] 次に示す[[アルゴリズム]]の一部または全部は仕様書上
「[DFN[[RUBYB[非同期的に]@en[asynchronously]]]]」
実行すると規定されており、それぞれ[[並列]]に実行されます。
[FIG(middle list)[
- [[ファイルシステム]]からの読み込み [SRC[[[File API]]]]
- [CODE(DOMm)@en[[[getUserMedia]]]] [SRC[[[getUserMedia]]]]
- [CODE(DOMi)@en[[[FontFace]]]] 関係のいくつかの処理 [SRC[[[css-font-loading]]]]
- [[バイブレーションを実施]] [SRC[[[Vibration API]]]]
- [CODE(DOMm)@en[requestIdleCallback]]
]FIG]
;; [12] [[HTML Standard]] で「asynchronously」と記述されていた箇所は明確化のためすべて
[[in parallel]] に置き換えられました [SRC[>>11, >>16]]。 >>13 のアルゴリズムはそれ以前に
[[HTML Standard]] の作法を真似たものの、追随していないものです。
[18] [[受動的]]な[[イベントリスナー]]しかない場合に、
[[利用者エージェント]]は[[イベント]]を含む処理を[[並列に]]実行することで[[最適化]]できるかもしれません
[SRC[>>19]]。
;; [[受動的リスナー]]の項も参照。
[22] 入出力の[[装置][装置 (Web)]]の処理も、[[並列に]]行われます。
[EG[
[23] 例えば[[マウス操作]]を[[プラットフォーム]]から随時受け取って、
適当な[[イベントループ]]に[[タスクを追加]]する必要があります。
]EG]
[EG[
[24] 例えば[[再生]]中の[[動画]]を処理して、適宜
([[イベントループ]]内の[[レンダリングの更新]]とは別に)
[[画面]]の[[描画]]に反映させる必要がある場合もあります。
]EG]
[EG[
[25] 例えば[[ストレージ][ストレージ (Web)]]への実際の書き込みを遅延させている場合、
[[タスク]]完了後、[[並列に]]、[[プラットフォーム]]に書き込み指示を引き渡す必要があります。
]EG]
[21] [[標準化]]の範囲外なので[[仕様書]]には明記されていませんが、
この他に、[[Webブラウザー]]の[[利用者インターフェイス]]に関わる処理も[[並列に]]実行する必要があります。
* 通信
[14] いくつかの[[アルゴリズム]]では[[同期区間]]という形で[[イベントループ]]との同期待ちが行われます。
;; [15] 実際には[[並列]]に実行される手続きの最後で[[マイクロタスク]]を追加するという形で実装されているかもしれません。
[105] [CODE(DOMi)@en[[[ApplicationCache]]]] の [CODE(DOMm)@en[[[abort]]]] [[メソッド]]は[RUBYB[裏で動いている]@en[in the background]]処理に対して[DFN[[RUBYB[信号を送信]@en[send a signal]]]]します。
* 停止
[72] ある[[アルゴリズム]]が同時に実行中の他の[[アルゴリズム]]を[RUBYB[停止]@en[abort]]させることがあります。
[FIG(list)[
- [73] [[fetch]] はしばしば停止させられることがあります。
-- [74] [[update the image data]]
-- [78] [[[CODE(HTMLe)@en[track]]処理モデルの開始]]
-- [80] [CODE(DOMi)@en[[[EventSource]]]] の [CODE(DOMm)@en[[[close]]]]
-- [81] [CODE(DOMi)@en[[[EventSource]]]] の [[forcibly close]]
-- [82] [CODE(DOMi)@en[[[EventSource]]]] が[[ごみ収集]]された場合
- [75] [[媒体要素読込算法]]が[[資源選択算法]]を停止させることがあります。
- [76] [[seek]] が同時に実行中の [[seek]] を停止させることがあります。
- [79] [[ワーカーを殺す]][[算法]]、[[ワーカーを終端させる]][[算法]]は実行中の[[スクリプト]]を停止させます。
- [77] [[[CODE(HTMLe)@en[track]]処理モデルの開始]]は他の[[算法]]は停止させませんが、
その代わりに動作中の同じ[[算法]]に処理を委ねて自身が停止します。
- [[update the image data]]
- [[バイブレーションを実施]]
]FIG]
* 歴史
[REFS[
- [11] [CITE@en[Web Applications 1.0 r8799 Stop using the word 'asynchronously', and reduce usage of the word 'synchronous'.]] ([TIME[2014-09-20 08:19:00 +09:00]] 版) <https://html5.org/r/8799>
- [16] [CITE@en[Sync with https://html5.org/r/8799 (Stop using the word 'asynchronously'... · fcc802a · ResponsiveImagesCG/picture-element]] ([TIME[2014-09-23 06:25:10 +09:00]] 版) <https://github.com/ResponsiveImagesCG/picture-element/commit/fcc802a79442529b3b5fb9eed4b8429c0699682a>
- [106] [CITE@en[Asynchronously -> in parallel · b2279a9 · whatwg/notifications]]
( ([TIME[2014-10-07 08:36:52 +09:00]] 版))
<https://github.com/whatwg/notifications/commit/b2279a91cfb2dcb6002ac54b7c5e3fe4dfc5fd91>
- [107] [CITE@en[Use "in parallel" · 21c1135 · whatwg/fetch]]
( ([TIME[2014-10-07 08:39:21 +09:00]] 版))
<https://github.com/whatwg/fetch/commit/21c113517998443dbc361be36f96524f3ee3a586>
- [17] [CITE@en[Make update the image data run when the document becomes active. · ee68507 · ResponsiveImagesCG/picture-element]] ([TIME[2014-10-23 10:40:49 +09:00]] 版) <https://github.com/ResponsiveImagesCG/picture-element/commit/ee685075cd65f02022d74b7932073fda4102d15f>
]REFS]
[20] [CITE@en[Add EventListenerOptions and passive event listener feature · whatwg/dom@253a21b]]
([TIME[2016-02-15 00:07:42 +09:00]] 版)
<https://github.com/whatwg/dom/commit/253a21b8e78e37447c47983916a7cf39c4f6a3c5>
[26] [CITE@en[Make navigate use "in parallel" · whatwg/html@77b1e02]]
([TIME[2016-05-01 13:52:47 +09:00]] 版)
<https://github.com/whatwg/html/commit/77b1e021bcb9229c60fc90dc72bbb0e0d1cff7e4>
[27] [CITE@en[refactor: install steps (#485)]]
([[marcoscaceres]]著, [TIME[2016-08-09 17:04:34 +09:00]])
<https://github.com/w3c/manifest/commit/e0906abde1fa4286526ecf866ee59856e3914716>
[28] [CITE@en["fetch a single module script" needs to post a task back to the main thread · Issue #2202 · whatwg/html]]
([TIME[2017-01-05 20:11:10 +09:00]])
<https://github.com/whatwg/html/issues/2202>
[29] [CITE@en[Make shared worker creation deterministic]]
([[jakearchibald]]著, [TIME[2017-09-21 22:27:09 +09:00]])
<https://github.com/whatwg/html/commit/9fda90f44c7c9223de6e3755a043f67ea7c92bf5>