2010-11-18 4 views
2

Erlangにチャットサーバーを実装しています。私の設計によると、各クライアントは、メッセージを処理するサーバーノード上に対応するエージェントプロセスを持っています。私はそれらの間でメッセージを交換できるようにエージェントのPIDsをデータベースに書いています。PIDによるErlangのプロセスの殺し

PIDを強制終了すると安全ですか?たとえば、私のサーバが再起動した後も、PIDはデータベースに残っていますが、プロセスは消滅します。データベース内のPIDが他の(新しく作成された)重要なプロセスと衝突する可能性はありますか?

もし私が単にクライアントが応答していないときにエージェントを強制終了することはできません。これまでのところ、私はそれを見たことはありませんが、確かに知っていることはうれしいでしょう。

答えて

7

PIDは、ノードが起動するたびに0.0.0(init)からスポーン順に割り当てられます。したがって、ノードの再起動の間にそれらを保存すると、簡単にPID衝突を取得できます。

あなたは特定のクライアントのPIDをルックアップできるようにするために何らかの種類のレジストリを構築しました。このレジストリは、無駄なPIDを適時に削除する必要があります。一般的な設計では、登録された各プロセスを監視し(erlang:monitor/2)、プロセスが終了して{'DOWN', Ref, process, Pid, Info}メッセージが受信されたときにレジストリエントリを削除します。

私はまた、erlangの外にPIDを格納することを追加します(データベースがetsまたはmnesiaでない場合)。この理由から、PIDはプロセスやノードが消滅した後に何も意味しません。

0

再起動後もPIDを再利用することができます。シーケンシャルなので、他のPIDと衝突する可能性は非常に高いです。ダウンしたノードに対応するデータベースのPIDをすべてクリアする必要があります。

1> spawn(fun() -> ok end). 
<0.35.0> 
2> spawn(fun() -> ok end). 
<0.37.0> 
3> spawn(fun() -> ok end). 
<0.39.0> 
+0

最初の文で "Pids can not be .."ではないはずですか? – ZeissS

+0

いいえ、私は私が言ったことを意味しました。 pidは[VMによる]再起動時に再利用できます。 –