gen_server:start()
とgen_server:start_link()
の違いを教えてもらえますか?Erlangでは、gen_serverの違いは何ですか:start()とgen_server:start_link()?
私は、それがマルチスレッドに関するものだと言われてきました。
EDIT: 私のgen_serverが複数のスレッドから呼び出された場合、一度にすべて実行されますか?それとも、これらのスレッド間で並行処理を作成するのでしょうか?
gen_server:start()
とgen_server:start_link()
の違いを教えてもらえますか?Erlangでは、gen_serverの違いは何ですか:start()とgen_server:start_link()?
私は、それがマルチスレッドに関するものだと言われてきました。
EDIT: 私のgen_serverが複数のスレッドから呼び出された場合、一度にすべて実行されますか?それとも、これらのスレッド間で並行処理を作成するのでしょうか?
どちらの関数は、呼び出し元プロセスの子として新しい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
については何もありません。
gen_server:start_link
を使用すると、新しいプロセスが呼び出しプロセスの「子」になります。監督ツリーの一部です。 gen_serverプロセスが終了すると、呼び出しプロセスに通知されます。
gen_server:start
を使用すると、監督ツリー外のプロセスが生成されます。
ニース説明はここにある:http://learnyousomeerlang.com/supervisors
私のgenserverが複数のスレッドから呼び出された場合、一度にすべてのスレッドを実行しますか?または、スレッド間で並行性を作成するのでしょうか? –
お返事ありがとうございます、私にもお答えできますか? –
Erlangは「スレッド」という用語を使用しません。それは「プロセス」と呼ばれています。複数のプロセスが同じgen_serverを呼び出すと、それらの要求はキューに入れられ、順番に処理されます。 http://learnyousomeerlang.com/contentにOTPについての非常に良い部分があります – Novakov
編集スティーブをご覧ください。 –
私はすでにあなたの編集内容に答えました。複数のプロセスが 'gen_server'を同時に呼び出すと、それらのメッセージは' gen_server'メッセージキューに入れられ、 'gen_server'はそれらのメッセージを1つずつ処理します。 –