gpt4 book ai didi

erlang - erlang spawn_monitor 的正确使用

转载 作者:行者123 更新时间:2023-12-01 23:11:09 25 4
gpt4 key购买 nike

仍在阅读 Joe 的书,并且很难完全理解监视器,尤其是 spawn_monitor。这是我的代码;练习要求编写一个函数,该函数将启动一个进程,其工作是每 5 秒打印一次心跳,然后编写一个函数来监视上述进程并重新启动它。我没有进入重新启动部分,因为我的监视器甚至无法检测到进程崩溃。

% simple "working" loop
loop_5_print() ->
receive
after 5000 ->
io:format("I'm still alive~n"),
loop_5_print()
end.

% function to spawn and register a named worker
create_reg_keep_alive(Name) when not is_atom(Name) ->
{error, badargs};
create_reg_keep_alive(Name) ->
Pid = spawn(ex, loop_5_print, []),
register(Name, Pid),
{Pid, Name}.

% a simple monitor loop
monitor_loop(AName) ->
Pid = whereis(AName),
io:format("monitoring PID ~p~n", [Pid]),
receive
{'DOWN', _Ref, process, Pid, Why} ->
io:format("~p died because ~p~n",[AName, Why]),
% add the restart logic
monitor_loop(AName)
end.

% function to bootstrapma monitor
my_monitor(AName) ->
case whereis(AName) of
undefined -> {error, no_such_registration};

_Pid -> spawn_monitor(ex, monitor_loop, [AName])
end.

这是我在玩的:
39> c("ex.erl").                    
{ok,ex}
40> ex:create_reg_keep_alive(myjob).
{<0.147.0>,myjob}
I'm still alive
I'm still alive
41> ex:my_monitor(myjob).
monitoring PID <0.147.0>
{<0.149.0>,#Ref<0.230612052.2032402433.56637>}
I'm still alive
I'm still alive
42> exit(whereis(myjob), stop).
true
43>

它确实停止了 loop_5_print "worker"- 但是显示器应该打印的行在哪里? 我看到的唯一解释是,以这种方式退出的进程发出的消息不是我在监视器循环的接收中匹配的模式。但这是本章书中介绍的唯一模式,所以我不买这个解释。

最佳答案

spawn_monitor不是你想要的。 spawn_monitor产生一个进程并立即开始监视它。当生成的进程终止时,调用 spawn_monitor 的进程收到进程已死的消息。您需要调用erlang:monitor/2来自您希望接收 DOWN 消息的进程,第二个参数是要监视的 Pid。

只需添加:

monitor(process, Pid),

后:
Pid = whereis(AName),

它有效:
1> c(ex).
{ok,ex}
2> ex:create_reg_keep_alive(myjob).
{<0.67.0>,myjob}
I'm still alive
I'm still alive
I'm still alive
3> ex:my_monitor(myjob).
monitoring PID <0.67.0>
{<0.69.0>,#Ref<0.2696002348.2586050567.188678>}
I'm still alive
I'm still alive
I'm still alive
4> exit(whereis(myjob), stop).
myjob died because stop
true
monitoring PID undefined

关于erlang - erlang spawn_monitor 的正确使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46456700/

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