2005年12月12日

JavaScript の非同期処理 (2)

 前回のテストでは、処理中に他の処理を呼び出している部分が有ったので、ひたすらCPUを回すように実験コードをちょっと変えて見た。

var result = ""; // 共有される大域変数
function synctest(name,ntimes) {
if ( ntimes>0 ) {
var d1 = new Date();
var s1 = "" + d1;
result += "<br>"+name+" = " + s1;
for (ntimes--;ntimes>0;) {
var d2 = new Date();
var s2 = "" + d2;
if ( s1!=s2 ) {
result += "<br>"+name+" = " + s2;
s1 = s2;
ntimes--;
}
}
}
}

 これは、指定された回数分だけ毎秒メッセージを記録する様なコードだ。JavaScript には sleep() や wait() に類する物が無いので、処理が終了するまでCPUを占有している。
これを使って、
1.setTimeout によって 0.5 秒後から10秒間実行する
2.setTimeout によって 1.0 秒後から10秒間実行する
3.setInterval によって 1.5 秒間隔で3秒間の実行処理を3回実行する
4.button.onclick によって10秒間実行する
5.XmlHttpRequest によってデータが読み込まれた後(約3秒後)から10秒間実行する
と言うイベント処理を設定して実行して見た。
これらの処理は、入り乱れて実行されるのか、シーケンシャルに実行されるのか、どうだろう?結果は、次の通りだった。

start program = Mon Dec 12 12:52:46 UTC+0900 2005
settimeout(0.5) = Mon Dec 12 12:52:46 UTC+0900 2005
settimeout(0.5) = Mon Dec 12 12:52:47 UTC+0900 2005
settimeout(0.5) = Mon Dec 12 12:52:48 UTC+0900 2005
settimeout(0.5) = Mon Dec 12 12:52:49 UTC+0900 2005
settimeout(0.5) = Mon Dec 12 12:52:50 UTC+0900 2005
settimeout(0.5) = Mon Dec 12 12:52:51 UTC+0900 2005
settimeout(0.5) = Mon Dec 12 12:52:52 UTC+0900 2005
settimeout(0.5) = Mon Dec 12 12:52:53 UTC+0900 2005
settimeout(0.5) = Mon Dec 12 12:52:54 UTC+0900 2005
settimeout(0.5) = Mon Dec 12 12:52:55 UTC+0900 2005
onreadystatechange = Mon Dec 12 12:52:55 UTC+0900 2005
onreadystatechange = Mon Dec 12 12:52:56 UTC+0900 2005
onreadystatechange = Mon Dec 12 12:52:57 UTC+0900 2005
onreadystatechange = Mon Dec 12 12:52:58 UTC+0900 2005
onreadystatechange = Mon Dec 12 12:52:59 UTC+0900 2005
onreadystatechange = Mon Dec 12 12:53:00 UTC+0900 2005
onreadystatechange = Mon Dec 12 12:53:01 UTC+0900 2005
onreadystatechange = Mon Dec 12 12:53:02 UTC+0900 2005
onreadystatechange = Mon Dec 12 12:53:03 UTC+0900 2005
onreadystatechange = Mon Dec 12 12:53:04 UTC+0900 2005
button.onclick = Mon Dec 12 12:53:04 UTC+0900 2005
button.onclick = Mon Dec 12 12:53:05 UTC+0900 2005
button.onclick = Mon Dec 12 12:53:06 UTC+0900 2005
button.onclick = Mon Dec 12 12:53:07 UTC+0900 2005
button.onclick = Mon Dec 12 12:53:08 UTC+0900 2005
button.onclick = Mon Dec 12 12:53:09 UTC+0900 2005
button.onclick = Mon Dec 12 12:53:10 UTC+0900 2005
button.onclick = Mon Dec 12 12:53:11 UTC+0900 2005
button.onclick = Mon Dec 12 12:53:12 UTC+0900 2005
button.onclick = Mon Dec 12 12:53:13 UTC+0900 2005
settimeout(1.0) = Mon Dec 12 12:53:13 UTC+0900 2005
settimeout(1.0) = Mon Dec 12 12:53:14 UTC+0900 2005
settimeout(1.0) = Mon Dec 12 12:53:15 UTC+0900 2005
settimeout(1.0) = Mon Dec 12 12:53:16 UTC+0900 2005
settimeout(1.0) = Mon Dec 12 12:53:17 UTC+0900 2005
settimeout(1.0) = Mon Dec 12 12:53:18 UTC+0900 2005
settimeout(1.0) = Mon Dec 12 12:53:19 UTC+0900 2005
settimeout(1.0) = Mon Dec 12 12:53:20 UTC+0900 2005
settimeout(1.0) = Mon Dec 12 12:53:21 UTC+0900 2005
settimeout(1.0) = Mon Dec 12 12:53:22 UTC+0900 2005
setInterval(1.5)1 = Mon Dec 12 12:53:22 UTC+0900 2005
setInterval(1.5)1 = Mon Dec 12 12:53:23 UTC+0900 2005
setInterval(1.5)1 = Mon Dec 12 12:53:24 UTC+0900 2005
setInterval(1.5)2 = Mon Dec 12 12:53:25 UTC+0900 2005
setInterval(1.5)2 = Mon Dec 12 12:53:26 UTC+0900 2005
setInterval(1.5)2 = Mon Dec 12 12:53:27 UTC+0900 2005
setInterval(1.5)3 = Mon Dec 12 12:53:28 UTC+0900 2005
setInterval(1.5)3 = Mon Dec 12 12:53:29 UTC+0900 2005
setInterval(1.5)3 = Mon Dec 12 12:53:30 UTC+0900 2005

 やはり、どのイベントも排他的に実行される様だ(win IE6)。

 良く考えて見れば、タイマーやボタンクリックは DOM の機能を
使っているので、JavaScript (ECMAScript)の仕様を見ても何も
わからない訳だ。そう考えて DOM の event 仕様を見てみても
はっきりとは書いていない。イベントの再入可能性の部分に
「events should be handled in a synchronous manner」と言う
記述があるが、これは同じイベントについての話なので、種類の
違うイベントにも適用されなければならない訳では無い。
さらに XmlHttpRequest は DOM オブジェクトでは無いので、
本来これは関係ない。
 と言う事で、仕様による動作と言う訳ではなさそうだが、現状の
実装はこうなっていると言う事で、ブラウザ上の JavaScript で、
マルチスレッドもどきを行う場合の参考にしておくと良いだろう。


posted by lepton at 14:11| 東京 ☀| Comment(0) | TrackBack(0) | JavaScript | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック
プロフィール
名前:lepton
年齢:over 40
ウェブサイトURL:http://www.hmsoft.co.jp/lepton/
メールアドレス:contact@hmsoft.co.jp
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。