在Erlang中重用进程的邮箱

时间:2014-11-17 17:40:42

标签: erlang

如果Erlang进程proc1被终止(exit(killed))并且另一个进程proc2被通知此事件,因为它已链接到进程proc1,是否有可能使用已终止进程{​​{1}}的邮箱重新生成替换进程?

1 个答案:

答案 0 :(得分:3)

不是真的。进程不共享任何数据,因此当一个进程死亡时,没有其他人可以访问它的任何内存。 Erlang不知道等待垃圾收集这样的邮箱需要多长时间。

您可以使用单独的代理流程来模拟,只跟踪邮箱。

或者你可以试着在proc1中处理更好的事情。您可以使用process_flag(trap_exit, true),这样您就可以将exit(killed)消息作为正常消息{'EXIT',FromPid,killed}接收。当您收到时,您会读取整个邮箱,然后继续退出所有邮件,这是退出原因的一部分。

看起来有点像这样:

init(Args) ->
   process_flag(trap_exit, true),
   .... % continiue process innicializaiton.

loop(State) ->
  receive 
   .... 
    {'EXIT', _FromPid, killed} ->
        exit({killed, all_messages()})
  end.


all_messages() ->
   all_messages([]).

all_messages(Messages) ->
     receive 
        AnyMessage ->
            all_messages( [AnyMessage|Messages])
     after 0 ->
            lists:reverse(Messages)
     end.

并且proc2会收到所有未处理的消息,并且可以再次将它们发送到新生成的进程。