2016-07-12 6 views
5

gen_server:start()gen_server:start_link()の違いを教えてもらえますか?Erlangでは、gen_serverの違いは何ですか:start()とgen_server:start_link()?

私は、それがマルチスレッドに関するものだと言われてきました。

EDIT: 私のgen_serverが複数のスレッドから呼び出された場合、一度にすべて実行されますか?それとも、これらのスレッド間で並行処理を作成するのでしょうか?

答えて

9

どちらの関数は、呼び出し元プロセスの子として新しいgen_serverインスタンスを起動し、彼らはgen_server:start_link/3,4がアトミックgen_server子供とその親へのリンクを開始することで異なりますプロセス。リンクするとは、子供が死ぬと、親はデフォルトで死ぬことになります。 Supervisorsは、子プロセスが異常終了したときにリンクを使用して特定のアクションを実行し、通常はそれらを再起動する親プロセスです。

これらの呼び出しには、マルチプロセスの側面はありません。 gen_server:startまたはgen_server:start_linkを使用して新しいgen_serverを開始するかどうかにかかわらず、新しいプロセスには単一のメッセージキューがあり、それらのメッセージを1つずつ受信して処理します。新しいgen_serverプロセスがgen_server:startで開始された場合とは異なる動作または動作をする原因となるものは、gen_server:start_linkについては何もありません。

+0

編集スティーブをご覧ください。 –

+1

私はすでにあなたの編集内容に答えました。複数のプロセスが 'gen_server'を同時に呼び出すと、それらのメッセージは' gen_server'メッセージキューに入れられ、 'gen_server'はそれらのメッセージを1つずつ処理します。 –

4

gen_server:start_linkを使用すると、新しいプロセスが呼び出しプロセスの「子」になります。監督ツリーの一部です。 gen_serverプロセスが終了すると、呼び出しプロセスに通知されます。

gen_server:startを使用すると、監督ツリー外のプロセスが生成されます。

Erlangで監督の

ニース説明はここにある:http://learnyousomeerlang.com/supervisors

+0

私のgenserverが複数のスレッドから呼び出された場合、一度にすべてのスレッドを実行しますか?または、スレッド間で並行性を作成するのでしょうか? –

+0

お返事ありがとうございます、私にもお答えできますか? –

+4

Erlangは「スレッド」という用語を使用しません。それは「プロセス」と呼ばれています。複数のプロセスが同じgen_serverを呼び出すと、それらの要求はキューに入れられ、順番に処理されます。 http://learnyousomeerlang.com/contentにOTPについての非常に良い部分があります – Novakov

関連する問題