erlang: монитор и сообщение «ВНИЗ» - PullRequest
4 голосов
/ 06 марта 2012

При внимательном изучении файла gproc_tests.erl проекта "gproc".Я нашел следующий код.«До свидания» сообщение отправляется до «erlang: monitor / 2», я думаю, что возможно, что сообщение «ВНИЗ» не будет получено.Это правильно?Если это так, две линии должны быть переключены, верно?

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).

Ответы [ 2 ]

10 голосов
/ 06 марта 2012

вызов 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
5 голосов
/ 06 марта 2012

Согласно документации erlang: monitor / 2 : Сообщение «ВНИЗ» будет отправлено процессу мониторинга, если Предмет умирает, , если Предмет не существует , или если соединение потеряно с узлом, на котором находится Item.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...