0

親と子を持つスーパーバイザー ツリーがあるとします。子供たちは一時的なものです。しかし、他のプロセスによって使用されます。親は、ユーザーを正しい子に向ける責任があります。

User  ---lookup(child)-->  Parent
User <----PidOfChild-----  Parent

User  --request(Resouce)--> Child
User <------respond------   Child

子が 2 つのシーケンスの間にシャットダウンしたとしましょう。ユーザー側でのクラッシュを回避するために、子をシャットダウンする正しい方法は何でしょうか?

ユーザーは子を監視できますが、それは本当に役に立ちます。ユーザーはこれらすべてを 1 つのトランザクション内で行っているのでしょうか?

4

3 に答える 3

2

この場合の正しい解決策は、ユーザー側で処理することです。ユーザーに応答するように子を「シャットダウン」するフェイルセーフな方法はありません。それを台無しにする競合状態がどこかに常にあります。

gen_server:cast/call を使用している場合は、リクエストが失敗するまでのタイムアウトを指定して、適切にキャッチすることができます。生の受信ブロックを使用する場合:

receive
    some_response -> {ok, some_response}
after
    5000 -> % do something.
end.
于 2013-02-24T00:33:13.293 に答える
1

ユーザー側に何かを持たないようにするための別のアプローチを考えている場合は、親を呼び出してすぐに子を呼び出す場合、親をメッセージ ブローカーとして作成できます。

User  ---request(Resouce)-->  Parent --request(Resouce)--> Child
User <---reponse------------  Parent <-response----------- Child

親は、ブロックを回避できるように、リクエストを子にキャストする必要があります。このようにして、親も子を追跡し、ユーザーに応じて応答することができます。子がシャットダウンした場合は、それに応じて再起動するか、アクティブな要求がない場合は子をシャットダウンできます。このアプローチではボトルネックになる可能性があるため、親には処理を含めないでください。

于 2013-02-25T16:00:17.817 に答える
0

子のシャットダウン前にリクエストが作成された場合は、receive ... after ...またはgen_server:callスキームを使用する必要があります。子のシャットダウン後にリクエストが作成された場合は、タイムアウトになるか子が使用可能になるまでリクエストを保留できます。

于 2013-02-25T04:42:22.093 に答える