阅读“了解一些Erlang”我发现我可以为给定的ets表设置一个进程继承人,它将收到消息:
{'ETS-TRANSFER', TableId, FromPid, Data}
当拥有该表的进程死亡时。
过了一会儿,我发现这个post对如何使用这样的功能保留ets表提出了不同的建议。
在最后一种方法中,用户建议也使用trap_exit来了解拥有该表的对等进程是否已经死亡。现在我的问题是:我先收到哪条消息?关于ets表的消息还是关于对等进程崩溃的消息?
是否真的有必要处理退出消息?当我收到ets消息时,我知道处理它的对等进程是死的吗?或者它还活着一段时间了吗?
答案 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对选择性接收有很好的解释,为什么/如何避免它优先接收收到的信息。