如何在Erlang中创建保持活动的进程
我现在正在阅读,在第13章的末尾,我们想创建一个保持活力的过程, 例如:如何在Erlang中创建保持活动的进程,erlang,Erlang,我现在正在阅读,在第13章的末尾,我们想创建一个保持活力的过程, 例如: on_exit(Pid, Fun) -> spawn(fun() -> Ref = monitor(process, Pid), receive {'DOWN', Ref, process, Pid, Info} -> Fun(Info) end
on_exit(Pid, Fun) ->
spawn(fun() ->
Ref = monitor(process, Pid),
receive
{'DOWN', Ref, process, Pid, Info} ->
Fun(Info)
end
end).
keep_alive(Name, Fun) ->
register(Name, Pid = spawn(Fun)),
on_exit(Pid, fun(_Why) -> keep_alive(Name, Fun) end).
但是在register/2
和on\u exit/2
之间时,进程可能会退出,因此监视器将失败,我将保持活动/2
更改如下:
keep_alive(Name, Fun) ->
{Pid, Ref} = spawn_monitor(Fun),
register(Name, Pid),
receive
{'DOWN', Ref, process, Pid, _Info} ->
keep_alive(Name, Fun)
end.
还有一个bug,在
spawn\u monitor/2
和register/2
之间,进程可能会退出。这是如何成功运行的?谢谢。在第二个示例中,如果进程在注册之前退出,register
将因badarg
而失败。最简单的解决方法是使用try。。。catch
并处理catch中的错误
您甚至可以将catch留空,因为即使注册失败,也会发送'DOWN'
消息
另一方面,我不会在生产系统中这样做。如果您的工作人员故障过快,很可能是因为其初始化代码存在问题,我想知道,它没有注册并停止系统。否则,它可能会失败,并在无休止的循环中重生。我不确定您是否有需要解决的问题。即使进程在注册/2后退出,监视器/2也会成功。监视器/2将发送一条“向下”消息,其信息组件将为noproc。根据文件: 如果项目死亡,如果项目不存在,或者项目所在节点的连接断开,将向监控流程发送一条“关闭”消息。(见附件) 那么,在您的原始代码中
我认为一切都很好。那么为什么不想使用erlang supervisor行为呢?它为创建和重新启动保持活动状态的进程提供了有用的函数
请看这里的示例:我认为OP只是想了解编程Erlang书中的练习/示例-我怀疑他还没有理解该文本的OTP部分。