9

多数の子プロセスを開始するスーパーバイザープロセスがあります。現在、子供が亡くなると、新しいPidを使用して新しいプロセスが生成されます。これは、死んだばかりの子プロセスの状態情報を失うことを意味します。クライアントが常に同じ識別子を使用して子プロセスと通信できるようにしたい。子プロセスが停止し、スーパーバイザーによって再開される可能性があるという事実にもかかわらず。

子プロセスを一意の名前で登録し、子の状態をetsテーブルに格納することを考えていました。問題は、Erlangでそのような問題に取り組むための推奨される方法は何ですか?

ありがとう!

4

3 に答える 3

9

プロセスの状態をetsテーブルに保存すると、クラッシュの合間に状態を維持するのに役立ちます。私は通常、プロセスに永続的な名前を付けるためにグローバルレジストリを使用します。(Player 200は{player、200}として登録されます。)ローカルレジストリを使用することはお勧めしません。アトムを使用する必要があり、子プロセスが多数ある場合は、アトムの制限を急いでかみ砕くことができるためです。それらを動的に作成します(player_200、player_201など)

ただし、子の状態をetsテーブルに保存することには、独自のリスクと問題があります。エラーが発生してからetsテーブルに保存されるまでの間に子がクラッシュした場合は、問題ないはずです。ただし、子がガベージ状態を保存する原因となるデータを処理し、次のメッセージの処理時にクラッシュした場合はどうなりますか?プロセスを再開し、etsテーブルから不良状態をロードして、次のメッセージで再度クラッシュします。これに対処する方法は確かにありますが、それは可能性があることを認識し、回避する必要があります。

Erlangはetsテーブルをすべてのプロセスに配布する問題を隠しますが、CPUと潜在的な競合を犠牲にしてそうします。etsテーブルに多くの変更をプッシュする場合は、パフォーマンスでそれを支払うことになります。

あなたの子供が墜落しているなら、とにかく、あなたは彼らが誤った状態を取り除く方法を探しているべきではありませんか?私は通常、原因を突き止めて修正する必要があるものとして、プロセスのクラッシュを取ります。?

于 2012-11-02T18:36:42.827 に答える