如何在Erlang中创建保持活动的进程

如何在Erlang中创建保持活动的进程,erlang,Erlang,我现在正在阅读,在第13章的末尾,我们想创建一个保持活力的过程, 例如: on_exit(Pid, Fun) -> spawn(fun() -> Ref = monitor(process, Pid), receive {'DOWN', Ref, process, Pid, Info} -> Fun(Info) end

我现在正在阅读,在第13章的末尾,我们想创建一个保持活力的过程, 例如:

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。根据文件:

如果项目死亡,如果项目不存在,或者项目所在节点的连接断开,将向监控流程发送一条“关闭”消息。(见附件)

那么,在您的原始代码中

  • 寄存器将名称关联到Pid
  • Pid模具
  • 调用on_exit并执行monitor/2
  • 监视器立即发送一条“DOWN”消息,该消息由on_exit生成的函数接收
  • 调用keep_alive/2执行接收语句的Fun(Info)

  • 我认为一切都很好。

    那么为什么不想使用erlang supervisor行为呢?它为创建和重新启动保持活动状态的进程提供了有用的函数


    请看这里的示例:

    我认为OP只是想了解编程Erlang书中的练习/示例-我怀疑他还没有理解该文本的OTP部分。