2013-05-25 7 views
11

次の図は、Jon Resigの書籍Secrets of the JavaScript Ninjaの第3章から抜粋したものです。ここでは、著者がブラウザのイベントループについて説明しています。ブラウザで実行されているJavaScriptの単一スレッドの概念

enter image description here

本はこれを言っている:

それはキューに をイベントを置き、ブラウザのメカニズムは、このイベントループモデルの外部にあることに注意することが重要です。イベントが発生したタイミングを判断し、それらを にプッシュするには、処理 が必要です。イベントキューは、 イベントを処理しているスレッドには参加しません。

私の質問は、ブラウザのJavaScriptがシングルスレッドであると言うのは間違いありませんか?明らかに2つの別々のタスク(イベントとイベントキューの処理はここで並行して行われている)が明確に分かれているので、この質問をします。

+0

上記の質問を(おそらく)もっと面白くすることは、**即時コールバック**([この回答](http://stackoverflow.com/a/2734311/1711186)で提案されているように)の影響である可能性があります。要するに**即時コールバック**はJavascriptコードが実行され、ブロッキングステートメント(つまり 'alert()')によって停止された他のコードはまだ完了していません(https://developer.mozilla.org /en-US/docs/Web/JavaScript/Guide/EventLoop#.22Run-to-completion.22)。これにより、第2のタスク「イベントキューイング」がマルチスレッド問題(すなわち決定論)を導入することができると思われる。良い質問! – humanityANDpeace

+0

可能な複製[シングルスレッドであることが保証されていますか?](http://stackoverflow.com/questions/2734025/is-javascript-guaranteed-to-be-single-threaded) – Liam

答えて

9

JavaScriptは、ブラウザまたはNodeJSのどこでもシングルスレッドで動作します。それは、決してどのような方法でマルチスレッドをサポートすることになっていなかった(と誰かがマルチスレッドのいくつかの種類とJSエンジンを実装し、おそらく場合は、悪い事は確かに、起こります)あなたの編集に答えるために

EDITを:

そのイベントキューをブラウザのメインループからデータ(マウス/ kbイベント、ネットワークイベントなど)で満たされます。 JSを実行するのと同じメインループ。あなたが投稿した人物は正しいが、それは現実をぼかす。 AFAIK 1つのスレッドだけがすべてを処理します(つまり、キューをいっぱいにして、行ごとに実行し、JSコードを実行します)。

編集:これを証明する1つの方法:非常に長いループとテキスト領域を作成します。ループが実行されている間にテキストを書き込もうとします。あなたはできません:メインループがループを実行しているので、それはkbイベントを処理できません。

EDIT:これは本当に良い答えのようだ:最後のEDITの後Is JavaScript guaranteed to be single-threaded?

2年:この答えは少し古くなって現実から切り離されます。 io.js(そしてその後のnode.js、おそらくChrom [e | ium]、FF、Safari)は、マルチプロセスサポート(ワーカー経由)に向かっています。その詳細についてはhereをご覧ください。

+0

@alexandernstあなたは[ javascriptはシングルスレッドであることが保証されていますか?](http://stackoverflow.com/questions/2734025/is-javascript-guaranteed-to-be-single-threaded?rq=1)質問AFAIK [...]がすべてを処理する(つまり、キューを満たして実行している、** line-by-line **、JSコード)というステートメントを再考してください。流行語は、**この質問のtoprunning回答](http://stackoverflow.com/a/2734311/1711186)で賢明に**即時コールバック**です。どう思いますか? – humanityANDpeace

+0

@humanityandpeace確かにそれは面白い読書です。私は本当に各ブラウザがあなたが本当に長いコードブロックを実行している状況をどのくらい正確に処理し、直ちにコールバックが発生するのかは分かりません。とにかく、私はあなたに保証することができます:あなたはこのコンセプトを中継する場合、それは保証され、逆行します。 JSはマルチスレッド/マルチプロセス/マルチの種類/タイプを実行するためのものではありません。 – alexandernst

+0

@alexandernst私はもう少し調べました。 firefoxを使用すると、 'alert()'を使用して実行を中止するときに、**即時コールバック/イベント**のこのような "役に立たない"動作を再現できます。私はまだこれがFirefoxのバグかどうか疑問に思います。同時性を扱う方法が「何であるべきか」を知るために仕様を読んでいるのですか? – humanityANDpeace

関連する問題