2012-01-24 25 views
53

私はnode.jsの詳細を調べていましたが、基本的には単一のスレッドモデルを提供していますが、非同期プログラミングをサポートしています。非同期プログラミングは、シングルスレッドプログラミングモデルでどのように機能しますか?

このような場合、非同期プログラミングはどのように処理されますか?ランタイム自体がスレッドを作成して管理するのと同じですが、プログラマはスレッドを明示的に作成できませんか?誰かが私にこのことについて学ぶためにいくつかのリソースを指すことができれば素晴らしいだろう。

答えて

70

私と今それを言う:非同期プログラミングは、必ずしもマルチスレッドを意味しません。

JavaScriptはシングルスレッドランタイムです.JavaScriptで新しいスレッドを作成することはできません。言語/ランタイムはJSをサポートしていないためです。

フランクはそれを正しく言っています(しかし、むやみに)英語では、あなたのアプリに何が入ったかを処理するメインのイベントループがあります。したがって、「このHTTPリクエストを処理する」イベントキューに追加され、必要に応じてイベントループによって処理されます。

非同期操作(たとえば、mysql dbクエリ)を呼び出すと、node.jsは "ちょっと、このクエリを実行"をmysqlに送信します。このクエリは時間がかかります(ミリ秒)。node.jsはMySQLの非同期ライブラリを使用してクエリを実行します。イベントループに戻って何か他のものを実行します。mysqlが私たちに戻るのを待っている間に HTTPリクエストを処理するように。

編集:これとは対照的に、単にそれに戻って取得するためのMySQLの(何もしない)の周りに待つことができるのNode.js。これは同期呼び出しと呼ばれます。あなたのウェイターがあなたの注文を料理に提出するレストランを想像し、シェフが料理をしている間に座って親指をつまむ。レストランでは、node.jsプログラムのように、そのような振る舞いは愚かです。空腹になって提供する必要がある他の顧客がいます。したがって、できるだけ非同期で、1人のウェイター(またはnode.jsプロセス)ができるだけ多くの人にサービスを提供できるようにする必要があります。

編集行わ

Node.jsのは、mysqlはCライブラリを使用して、その技術的にはこれらのCライブラリはスレッドをオフに産卵可能性と通信が、JavaScriptの内側に、あなたは、スレッドと何もできません。

+9

もっと正確に。 "Node.jsは非同期APIを介してmysqlと通信します。非同期APIの実装はC言語で実装されており、その実装はスレッドプールを通じて同期APIを実行するだけです"。非同期APIがスレッドプールを内部的に使用する可能性があるという事実は、気にしない低レベルの詳細です。 – Raynos

+0

ああ、mysqlは別のスレッドで実行されているので、完了したらJSにイベントを戻します。私自身の非同期モジュールを作りたければ、ノード内の子プロセスを使って同じ効果を得ることができました。 – BigOmega

+3

私は本当にここの単語「スレッド」を避けるほうが良いと思います。人々はそれを聞いて偽の結論に飛びます。非同期呼び出しはスレッドを使用したり、プロセスをforkしたり、何かを行うことがあります。重要なことは、後でイベントループにコールバックまたはイベントが発生する可能性があるということです。 – flow

8

Ryanは最高だと言っています。sync/asyncは、シングル/マルチスレッドと直交しています。シングルスレッドおよびマルチスレッドの場合、Reactor Patternを使用して登録されたコールバックを呼び出すメインイベントループがあります。シングルスレッドの場合、コールバックはメインスレッド上で順番に呼び出されます。マルチスレッドの場合、別々のスレッドで呼び出されます(通常はスレッドプールを使用します)。どのような競合が起こるのかは本当に問題です。すべての要求が単一のデータ構造(たとえば、サブスクライバのリスト)への同期アクセスを必要とする場合、複数のスレッドを持つ利点が少なくなる可能性があります。それは問題に依存します。

フレームワークがシングルスレッドの場合、poll/selectシステムコールを使用している可能性があります。つまり、OSは非同期イベントをトリガーしています。

関連する問題