2

「Learn You Some Erlang」を読んで、メッセージを受け取る特定の ets テーブルのプロセス継承者を設定できることを発見しました。

{'ETS-TRANSFER', TableId, FromPid, Data}

テーブルを所有しているプロセスが終了したとき。

しばらくして、そのような機能を使用して ets テーブルを保持する方法に関する別の提案が記載されたこの投稿を見つけました。

最後の方法では、ユーザーは、テーブルを所有しているピア プロセスが停止しているかどうかを知るために、trap_exit も使用することを提案しています。ここで私の質問は、どのメッセージを最初に受け取るかです。ets テーブルに関するメッセージですか、それともピア プロセスのクラッシュに関するメッセージですか?

終了メッセージを処理する必要は本当にありますか? ets メッセージを受信すると、それを処理するピア プロセスが完全に機能していないことがわかります。それともしばらく生きているのでしょうか?

4

1 に答える 1

4

投稿によると、give_away の後、作成プロセスが停止した場合、プロセス SomeOtherProcess はフォーム{'ETS-TRANSFER', TableId, OldOwner, GiftData}が間違っているというメッセージを受け取ります。Give_away /3が呼び出されると、すぐに SomeOtherProcess が新しい所有者プロセスになり、作成者が死んでいなくてもこのメッセージを受け取ります。

あなたが言ったように、終了信号も処理する必要はありませんが、終了メッセージの受信時に他の操作を実行したい場合があります。(give_away チェーンの処理、テーブルを所有者から作成者に戻すなど)

通常、「ETS-TRANSFER」メッセージが「EXIT」の前に表示されますが、これについては返信できません。したがって、Roberto Aloi が述べたように、選択的な受信を行うことができます。ネスティング受信により、選択受信を実現します。例

receive
    {'EXIT', Pid, Reason} ->
        receive
            {'ETS-TRANSFER', TableId, OldOwner, HeirData} ->
                got_table
        after 0 ->
                ignore
        end 
after 0 ->
        ignore
end.

LearnYouSomeErlangには、選択的受信と、受信したメッセージを優先するためにそれを回避する理由/方法についての適切な説明があります。

于 2013-03-08T19:11:27.560 に答える