Erlang ets表继承和陷阱_退出消息

Erlang ets表继承和陷阱_退出消息,erlang,ets,Erlang,Ets,在阅读“了解一些Erlang”时,我发现我可以为给定的ets表设置一个进程继承人,该表将接收以下消息: {'ETS-TRANSFER', TableId, FromPid, Data} 当拥有表的进程死亡时 过了一段时间,我发现这与关于如何使用此功能保留ets表的不同建议 在最后一种方法中,用户建议也使用trap_exit,以了解拥有该表的对等进程是否已死亡。现在我的问题是:我首先收到哪条消息?关于ets表的消息还是关于对等进程崩溃的消息 是否确实需要处理退出消息?当我收到ets消息时,我知道

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

{'ETS-TRANSFER', TableId, FromPid, Data}
当拥有表的进程死亡时

过了一段时间,我发现这与关于如何使用此功能保留ets表的不同建议

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


是否确实需要处理退出消息?当我收到ets消息时,我知道处理它的对等进程是完全正确的?或者它还存在一段时间吗?

根据帖子的说法,在放弃之后,如果创建过程死亡,其他进程将收到一条消息,形式为
{'ETS-TRANSFER',TableId,oldwowner,GiftData}
错误。调用时,SomeOther进程立即成为新的所有者进程并接收此消息,即使创建者没有死

正如您所说的,实际上也不需要处理退出信号,但您可能希望在接收退出消息时执行任何其他操作。(还包括处理赠送链、从所有者处将表格送回创建者等)

通常我遇到的情况是,“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.

对选择性接收以及为什么/如何避免优先接收消息进行了很好的解释。

根据帖子,在放弃后,如果创建过程终止,其他进程将接收格式为
{'ETS-TRANSFER',TableId,oldwowner,GiftData}
的消息。调用时,SomeOther进程立即成为新的所有者进程并接收此消息,即使创建者没有死

正如您所说的,实际上也不需要处理退出信号,但您可能希望在接收退出消息时执行任何其他操作。(还包括处理赠送链、从所有者处将表格送回创建者等)

通常我遇到的情况是,“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.

很好地解释了选择性接收以及为什么/如何避免选择性接收,以优先处理接收到的消息。

一般来说,只有在两个进程之间才能保证消息的顺序性。换句话说,如果B向A发送两条消息,我可以假定顺序将被保留。如果B和C都向a发送消息,我不能保证a接收消息的顺序。好的,所以我不知道哪个消息将首先发送到我的进程收件箱。正确。但是你可以实现某种形式的选择性接收,这样你就可以按顺序处理它们。如果你能把你的评论放在一个答案中,我会接受的。一般来说,只有在两个进程之间才能保证消息的顺序性。换句话说,如果B向A发送两条消息,我可以假定顺序将被保留。如果B和C都向a发送消息,我不能保证a接收消息的顺序。好的,所以我不知道哪个消息将首先发送到我的进程收件箱。正确。但是你总是可以实施某种形式的选择性接收,这样你就可以按顺序处理它们。如果你能把你的评论写进一个答案,我会接受的。我已经在处理ets的传输,并重新启动了死亡的过程。选择性接收是不可能的,因为我使用的是gen_服务器…所以我可能应该匹配状态中的某些值。我已经在处理ets传输,并重新启动已停止的进程。选择性接收是不可能的,因为我使用的是gen_服务器…所以我可能应该匹配状态中的某个值