gpt4 book ai didi

erlang - 如何在 Erlang 中创建一个 keep-alive 进程

转载 作者:行者123 更新时间:2023-12-02 01:16:33 25 4
gpt4 key购买 nike

我正在阅读Programming Erlang ! ,在第 13 章的末尾,我们要创建一个 keep-alive 进程,该示例如下:

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/2on_exit/2之间,进程可能会退出,因此监视器会失败,我更改了keep_alive/2 > 像这样:

keep_alive(Name, Fun) ->
{Pid, Ref} = spawn_monitor(Fun),
register(Name, Pid),
receive
{'DOWN', Ref, process, Pid, _Info} ->
keep_alive(Name, Fun)
end.

还有一个错误,在spawn_monitor/2register/2之间,进程可能会退出。这怎么可能成功运行呢?谢谢。

最佳答案

我不确定您是否有需要解决的问题。即使您的进程在 register/2 之后退出,Monitor/2 也会成功。 Monitor/2 将发送一条“DOWN”消息,其 Info 组件将为 noproc。根据文档:

A 'DOWN' message will be sent to the monitoring process if Item dies, if Item does not exist, or if the connection is lost to the node which Item resides on. (see http://www.erlang.org/doc/man/erlang.html#monitor-2).

所以,在你的原始代码中

  1. 注册名称与 Pid 的关联
  2. Pid 去世
  3. 调用on_exit并执行monitor/2
  4. 监视器立即发送一条“DOWN”消息,该消息由 on_exit 生成的函数接收
  5. 调用 keep_alive/2 执行接收到的语句的 Fun(Info)

我认为一切都很好。

关于erlang - 如何在 Erlang 中创建一个 keep-alive 进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25617769/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com