私は現在、Erlang をそれなりのペースで学んでいますが、スーパーバイザと一緒に gen_server について質問があります。gen_server プロセスがクラッシュし、結果としてスーパーバイザーによって再起動された場合、プロセスは新しい pid を受け取ります。では、他のプロセスがそのプロセスを Pid で参照したい場合はどうすればよいでしょうか? これらのプロセスでPidを「更新」するための良い慣用的な方法は何ですか?
いくつかの実用的なアプリケーションの演習として、クライアントが任意のキーでロックを要求できるロック サーバーを作成しています。理想的には、特定のロックのロックと解放を別々のプロセスに処理させたいと考えています。これは、gen_server でタイムアウト引数を使用して、N 時間後に誰もプロセスを要求しなかった場合にプロセスを終了できるという考えです。関連するロックはメモリに残ります。これで、ロック名をロック プロセスにマップするディレクトリ プロセスが作成されました。ロック プロセスが終了すると、ディレクトリからロックが削除されます。
私の懸念は、ロック プロセスの終了中にクライアントがロックを要求した場合の処理方法です。まだシャットダウンしていないため、pid が生きていることをスニッフィングしても機能しません。ロック プロセスは、ディレクトリから削除する句にまだ達していません。
これを処理するより良い方法はありますか?
編集
現在、2 つの gen_servers があります。LockName -> Lock Process から ETS テーブルを維持する「ディレクトリ」と、start_child を使用して監視ツリーに動的に追加される「ロック サーバー」です。理想的には、各ロックサーバーがクライアントとの対話を直接処理することを望んでいますが、プロセスがクラッシュしているときに呼び出しまたはキャストで取得/解放の要求が発行されるシナリオについて心配しています (したがって、応答しません)メッセージに)。
{local} または {global} で始まるのは、N 個の数が存在する可能性があるため機能しません。