Ets表继承和trap_exit消息



阅读"Learn You Some Erlang"我发现我可以为给定的ets表设置一个进程继承人,它将接收消息:

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

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

过了一段时间,我发现了这篇关于如何使用这种功能来保存ets表的不同建议。

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

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

根据帖子,在give_away之后,如果创建进程死亡,进程SomeOtherProcess将收到{'ETS-TRANSFER', TableId, OldOwner, GiftData}错误的消息。当give_away/3被调用时,SomeOtherProcess立即成为新的所有者进程并接收此消息,即使创建者没有死亡。

正如您所说的,实际上也没有必要处理退出信号,但您可能希望在接收退出消息时执行任何其他操作。(也处理give_away链,将表从所有者返回到创建者等)

通常我遇到的是"ETS-TRANSFER"消息出现在"EXIT"之前,但我们无法对此作出答复。因此,正如罗伯托·阿洛伊所提到的,我们可以选择性接收。选择性接收是使用嵌套接收实现的。示例

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

LearnYouSomeErlang对选择性接收有很好的解释,以及为什么/如何避免它来优先接收消息。

相关内容

  • 没有找到相关文章

最新更新