2012-01-22 15 views
29

秒ごとにsetIntervalのメソッドを持つJavaScriptコードについて話すことができます。非同期プログラミングはマルチスレッドを意味しますか?

私はまた、何らかの制御のためにonblurアニメーションイベントを持っています。

onblur(+アニメーション)が発生した場合は、setIntervalの機能を得ることがあります。

私の質問は
です。非同期プログラミングはマルチスレッド化を意味しますか? (どんな方法で?)

私はJavascriptがマルチスレッド言語ではないことを知っています。

だから...?

+3

いいえ、非同期性(ism?)は並列処理を必要としません。 –

+0

にはスレッドがありますが、プログラマー/言語のコンシューマーとしてはそうではありません。 – Jason

+2

@ Jasonカバーの下に糸がありません。少なくとも、そこにいる必要はありません。 – Raynos

答えて

62

いいえ文字通り意味するのは非同期です。プログラマとして成功するためには、非同期プログラミングとスレッドベースプログラミングの違いを理解することが重要です。

従来のスレッド化されていない環境では、関数が外部イベント(ネットワークイベント、キーボードイベントまたはマウスイベント、さらにはクロックイベントなど)を待機する必要があるときは、プログラムはになるまでを待つ必要がありますイベントが発生します。

マルチスレッド環境では、プログラミングの多くのスレッドが同時に実行されています。 (CPUの数とオペレーティングシステムのサポートによって、これは文字通り真実かもしれないし、洗練されたスケジューリングアルゴリズムによって作られた錯覚かもしれない)。この理由から、マルチスレッド環境は困難であり、お互いのメモリをロックしてお互いのオーバーランを防止するという問題があります。

非同期環境では、単一のプロセススレッドが常に実行されますが、イベントドリブンの理由で(そしてそれがキーです)、ある機能から別の機能に切り替えることがあります。イベントが発生すると、と、現在実行中のプロセスが別のイベントを待つ必要があるポイントに達すると、javascriptコアがイベントのリストをスキャンし、次のイベントを(正式には)不定)オーダーをイベントマネージャーに送信します。

このような理由から、イベント駆動の非同期プログラミングは、メモリ競合問題などの従来のマルチスレッドプログラミングの落とし穴の多くを回避します。イベントが処理される順序はあなた次第ではありませんが、まれに管理しやすいため、競合状態が残っている可能性があります。一方、イベントハンドラは、現在実行中の関数がアイドルスポットに達するまでイベントを配信しないため、一部の関数は残りのプログラミングを飢えさせる可能性があります。これはNode.jsで起こります。たとえば、人々がサーバーで愚かに大量の数学を行うと、ノードが答えを出すのを「待機」する小さなサーバーに最適です。 Node.jsはイベント用の小さなスイッチボードですが、100ミリ秒以上かかるものはクライアント/サーバーの方法で処理する必要があります。

ブラウザの環境では、DOMイベントは自動イベントポイントとして扱われます(DOMを変更すると、多くのイベントを配信する必要があります)が、ひどく書かれたJavascriptでもコアが枯渇することがありますこれらの "このスクリプトは応答を停止しました"という割り込みハンドラを持っています。

+1

jQueryでajaxを呼び出すと、ブラウザ側で他の機能を維持している間にサーバ側のコードが処理をします。 –

+6

これらはスレッドではありません。ブラウザ側のコードでサーバーにメッセージを送信しました。 *コールが返されたとき*はイベントであり、コードはそれを受け取って何かをすると予想されます。待っている間、イベントループは他のイベントを処理します。イベントが返ってくると、イベントループはコールバックの終わりに達するか、イベントループを進行させる何かをすることによって、または新しいイベントを作成することによって、あなたがコールバックを放棄するまで、コールバックに単一のプロセススレッドに対する完全な制御を与えます。 –

+5

偉大な答え、適度に特殊な意味でそれを説明してくれてありがとう – Jason

0

コードを偶然実行し、競合状態を危険にさらすという意味でのみです。タイムアウトや間隔を使用しても、パフォーマンス上の利点はありません。

しかし、HTML5のWebWorkersは、ブラウザでの本当のマルチスレッド処理を可能にします: http://www.html5rocks.com/en/tutorials/workers/basics/

5

シングルスレッドのイベントループがシングルスレッドの言語で非同期であることの良い例です。

eventLoopdoLaterコールバックハンドラを添付することをコンセプトにしています。 は、それぞれdoLaterハンドラの特定のタイムスタンプが満たされているかどうかを調べる場合はwhile(true)、それ以外の場合はハンドラを呼び出します。興味のある方のため

、ここsingle threaded event loop in JavaScript

のナイーブ(と恐ろしく非効率的なおもちゃ)の実装は、これはあなたのシングルスレッドのOSのスレッドスケジューラへのアクセスのいずれかの種類せずに、あなたに忙しい待機を余儀なくされていることを意味するんですdoLaterコールバック。

あなたはちょうどあなたがあなたの単一のスレッドをdescheduleし、OSは他のことをやらせるので、その後、ビジーウェイトがより効率的である次のdoLaterハンドラまでsleepを行うことができsleep電話を持っている場合。

-3

コールバックがある場合は、何かをコールする必要があります。実行単位はスレッド&なので、他のスレッドはコールバックを直接呼び出すか、または開始スレッドに非同期プロシージャ呼び出しをキューイングする必要があります。

+0

_同じ単一のthread_が後でコールバックを呼び出すことは完全に可能です。 – Raynos

+0

@レイノスどう?あるスレッドが直接関数を呼び出すと、それは単に「呼び出し」と呼ばれます。コールバックがいくつかの入力ループでスレッドに通知された場合、何かがコールバックをキューに入れていなければなりません。ドライバはこれを直接行うことができますが、通常はカーネルスレッドです。 –

+0

イベントループ全体を単一のスレッドで実行させることにより、スレッドはIOを実行できないことに注意してください。スレッドとスレッド間で非同期通信しかできません。これは歩兵です。 – Raynos

関連する問題