erlang - ets 表继承和 trap_exit 消息

标签 erlang ets

阅读“学习一些 Erlang”,我发现我可以为给定的 ets 表设置一个将接收消息的进程继承人:

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

当拥有该表的进程终止时。

过了一会儿我发现了这个post对于如何使用此类功能保留 ets 表有不同的建议。

在最后一种方法中,用户建议还使用 trap_exit 来了解拥有该表的对等进程是否已死亡。现在我的问题是:我首先收到哪条消息?有关 ets 表的消息还是有关对等进程崩溃的消息?

真的有必要处理退出消息吗?当我收到 ets 消息时,我知道处理它的对等进程已经死了,对吗?或者它还活着一段时间了?

最佳答案

根据帖子,在 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对选择性接收以及为什么/如何避免它以优先接收收到的消息有很好的解释。

关于erlang - ets 表继承和 trap_exit 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15267837/

相关文章:

windows - Windows 上的 Erlang 透析器

erlang - 如何检查 ETS Erlang/Elixir 中是否存在命名表

erlang - 遍历和更新 Erlang ETS 表中所有元素的最佳方法是什么?

erlang - ets `public` `named`表和 `local`和 `ram_copy` mnesia表有什么区别

elixir - 字符串操作 : join with comma

erlang - ets 是否提供了一种一次性进行更新和读取的方法——比如增量操作?

regex - Erlang中的字符串正则表达式匹配

erlang - 如何通过在 Elixir 中调用进程来捕获或挽救被调用进程的崩溃错误

erlang - 避免 SPOJ 中 Erlang 中的 NZEC 错误

erlang 关于套接字的一般问题