2011-11-01 19 views
5

私はいつもJavaScriptはシングルスレッドであると聞いています。 JavaScriptが実行されると、すべて同じスレッドで実行されます。JavaScriptとシングルスレッド

これは真実かもしれませんが、その単一の実行スレッドは新しいスレッドを生成し、非同期にデータをメインスレッドに戻します。たとえば、XMLHttpRequestが送信されると、ブラウザはHTTPトランザクションを実行する新しいスレッドを作成しないで、XMLHttpRequestが返ったときにメインスレッドでコールバックを呼び出しますか?

タイマーについて - setTimeoutとsetIntervalについて教えてください。それらはどのように機能しますか?

このシングルスレッドは言語の結果ですか?新しいWeb Workersドラフトの前にJavaScriptがマルチスレッド実行を停止した原因は何ですか?

+0

Java Scriptインタープリタはブラウザを共有することが多いUIスレッド – david

+2

次回はグローバルスコープについて話していますが、私は用語を使用します** global mosh pit ** :) –

+0

inb4 HTML5 Webワーカー – Ben

答えて

3

ajax呼び出しに関連する方法を含め、javascriptイベントキューの仕組みについては、this postを参照してください。

ブラウザは、システムイベント(マウス、キーボード、タイマー、ネットワークイベントなど)を取得するために、OSへの実際のインターフェイスを処理するために、少なくとも1つのネイティブOSスレッド/プロセスを使用します。複数のネイティブOSレベルのスレッドが存在するかどうかは、ブラウザの実装に依存し、Javascriptの動作に実際には関係しません。外部からのすべてのイベントは、javascriptイベントキューを通過し、以前のjavascriptスレッドの実行が完了し、次のイベントがjavascriptエンジンに与えられたキューから取得されるまで、イベントは処理されません。

4

JavaScript自体はシングルスレッドです。しかし、ブラウザ内の他のスレッド(CやC++のようなものでよく書かれます)とやりとりすることができます。これが非同期XHRの仕事です。ブラウザは新しいスレッドを作成することがあります(またはイベントループを使用して既存のスレッドを再利用することがあります)。

タイマーとインターバルはJavaScriptを後で実行させようとしますが、実行中のwhile(1){ ; }それを中断するタイマーまたはインターバル。

(編集:left something out) シングルスレッド化は主にECMA仕様の結果です。実際には複数のスレッドを扱うための言語構造はありません。複数のスレッドを持つJavaScriptインタプリタとそれらとやりとりするツールを書くことは不可能ではありませんが、誰もそれを実際には行いません。確かに、誰もWebブラウザでそれを行うことはありません。それはすべてを台無しにするだろう。 (Node.jsのようなサーバーサイドで何かをしているのであれば、JavaScriptでマルチスレッドを回避していることがわかります。スニークなイベントループとオプションのマルチプロセッシングが必要です。

6

XMLHttpRequest現在のスレッドをブロックしません。ただし、ランタイム内の仕様は、どの仕様書にも記載されていません。これは、非ブロッキングI/Oを使用して、別のスレッドまたは現在のスレッド内で実行されます。

setTimeoutゼロまで実行すると、実行のために項目を追加、setIntervalセットタイマー、実行スタック、コードの実行が停止した場合にJavaScriptエンジンを開始する関数/コールバックのコードの行のいずれか。言い換えれば、JavaScriptエンジンは、現在行っている処理をすべて終了した後に何かを実行するようにJavaScriptエンジンに指示します。これを実際に見るには、1つのメソッド内に複数のsetTimeoutを設定して呼び出します。

0

ブラウザにはジョブを実行するための他のスレッドがあるかもしれませんが、あなたのJavaScriptコードは1つのスレッドで実行されます。実際にどのように動作するかは次のとおりです。

タイムアウトの場合、ブラウザはタイムアウトが終了するのを待つか、または実際のタイミングロジックを実装するために他のメカニズムを使用するために別のスレッドを作成します。タイムアウトが経過すると、メインイベントキューにメッセージが配置され、実行時にハンドラを実行するように指示されます。メインスレッドがメッセージを受け取るとすぐにそれが起こります。

AJAXリクエストも同様に動作します。一部のブラウザの内部スレッドは、実際にサーバに接続して応答を待つことがあり、応答が利用可能になると、メインスレッドがそのハンドラを実行するようにメインイベントキューに適切なメッセージを配置します。

すべての場合、コードはメインスレッドによって実行されます。これは、ブラウザがあなたのロジックを隠すことを除いて、他のほとんどのUIシステムと変わらない。他のプラットフォームでは、別のスレッドを処理し、UIスレッドでハンドラの実行を保証する必要があります。

0

スレッドの観点から言えば、私が気づいているブラウザでは、一般的に、ある時点で1ブロックのJavaScriptしか実行されません。

あなたは非同期Ajaxリクエストを作るか、またはsetTimeoutまたはsetIntervalを呼び出すと、ブラウザは彼らは別のスレッドで管理することもできるが、コードの現在実行中のブロックの後、いくつかのポイントが終了するまで、コールバックの実際のJSコードが実行されません。それはちょうどキューに入れられます。あなたは上記の「後のsetTimeoutが表示されます実行する場合

setTimeout("alert('Timeout!');", 5); 
alert("After setTimeout; before loop");  
for (var i=0, x=0; i < 2000000; i++) { x += i }; 
alert("After loop"); 

:あなたがsetTimeoutをした後、同じブロック内に比較的長時間実行されるコードの一部を置けば

これを実証するための簡単なテストです"警告が表示されると、ループが実行されている間に一時停止が発生します。その後、" After loop "が表示され、その後で"タイムアウト! "が表示されます。 - 明らかに5ミリ秒以上が経過しています(特に、最初のアラートを閉じるまでに時間がかかる場合)。

シングルスレッドのよく引用されている理由は、ブラウザでページをレンダリングする作業が簡単になるということです.JavaScriptのスレッドをたくさん使ってDOMを同じように更新しようとすると時間。

0

JavaScriptは埋め込まれるように設計された言語です。これは、さまざまなオペレーティングスレッドでjavascriptを同時に実行するプログラムで使用されています。新しい実行スレッドの作成を明示的に制御するための組み込み言語に対する要求はあまりありませんが、ホストオブジェクトに必要な機能を提供することで確実に実行できます。 WHATWGは実際にはincludes a justification for their decision not to push a standard concurrent execution capability for browsersです。

関連する問題