ets表继承和trap_exit消息

时间:2013-03-07 09:46:45

标签: erlang ets

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

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

当拥有该表的进程死亡时。

过了一会儿,我发现这个post对如何使用这样的功能保留ets表提出了不同的建议。

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

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

1 个答案:

答案 0 :(得分: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对选择性接收有很好的解释,为什么/如何避免它优先接收收到的信息。