仔细研究“gproc”项目的gproc_tests.erl文件时。我找到了以下代码。 “再见”消息在“erlang:monitor / 2”之前发送,我认为有可能不会收到“DOWN”消息。这是对的吗?如果是这样,应该切换两条线,对吗?
t_simple_aggr_counter() ->
?assert(gproc:reg({c,l,c1}, 3) =:= true),
?assert(gproc:reg({a,l,c1}) =:= true),
?assert(gproc:get_value({a,l,c1}) =:= 3),
P = self(),
P1 = spawn_link(fun() ->
gproc:reg({c,l,c1}, 5),
P ! {self(), ok},
receive
{P, goodbye} -> ok
end
end),
receive {P1, ok} -> ok end,
?assert(gproc:get_value({a,l,c1}) =:= 8),
?assert(gproc:update_counter({c,l,c1}, 4) =:= 7),
?assert(gproc:get_value({a,l,c1}) =:= 12),
P1 ! {self(), goodbye}, %<<===========This line
R = erlang:monitor(process, P1), %<<======This line
receive {'DOWN', R, _, _, _} ->
gproc:audit_process(P1)
end,
?assert(gproc:get_value({a,l,c1}) =:= 7).
答案 0 :(得分:10)
erlang:monitor / 2调用仍然会向调用进程生成一个{'DOWN',...}消息,即使受监视的进程已经死亡。
例如:
1> F = fun() -> io:format("finished.~n") end.
#Fun<erl_eval.20.111823515>
2> Pid = spawn(F).
finished.
<0.45.0>
3> erlang:monitor(process, Pid). % process Pid has already exited.
#Ref<0.0.0.76>
4> flush().
Shell got {'DOWN',#Ref<0.0.0.76>,process,<0.45.0>,noproc}
ok
答案 1 :(得分:5)
根据文档erlang:monitor/2:如果项目死亡,如果项目不存在,或者如果连接丢失,则“DOWN”消息将被发送到监控过程到项目所在的节点。