Процессы нереста Erlang

Ниже приводится программа, в которой я попытался создать 3 процесса из метода под названием best. Я хочу получить ответ от всех процессов и сохранить их в виде кортежа, но могу получить только один ответ.

test() ->
    receive
     {From,N} -> From!{self(),N},
                 loop()
    end.

best(N) ->    
     Aid=spawn(fun t:loop/0),
     Aid ! {self(),N},
     Bid=spawn(fun t:loop/0),
     Bid ! {self(),N},
     Cid=spawn(fun t:loop/0),
     Cid ! {self(),N},
     receive 
        {Pid,Response} ->{Response}
     end.

Может ли кто-нибудь помочь мне с этой проблемой


person s1122    schedule 27.10.2014    source источник
comment
Для создания нескольких процессов я использую этот подход stackoverflow.com/a/20573151/49197   -  person Hynek -Pichi- Vychodil    schedule 27.10.2014
comment
Имя функции - test (), я думаю, это должно быть loop ().   -  person abcd    schedule 09.04.2015


Ответы (2)


Ваш блок приема в функции best / 2 завершится, как только получит одно сообщение. Если вы запустите этот код в оболочке, вы можете убедиться, что другое сообщение все еще находится в очереди сообщений с помощью функции flush (). (В опубликованном вами коде отсутствует функция t: loop / 0, я предполагаю, что она вычислит что-то на основе N и вернет ответ через сообщение в создатель)

Чтобы иметь возможность получать более одного сообщения, вы должны поместить блок приема в «цикл», который рекурсивно вызывает сам себя, пока не получит все ответы. Вам нужно будет использовать переменную, которая позволяет рекурсивному циклу знать, когда он завершен (количество ожидаемых ответов, список процессов, которые должны ответить ...), и, например, собирать ответы в переменной списка.

person Pascal    schedule 27.10.2014

-module(wy).
-compile(export_all).

loop() ->
    Self = self(),
    receive 
    {From, Ref, N} ->
        From ! {Self, Ref, N * N}
    end.

receive_result(Ref) ->
    receive 
    {Pid, Ref, R} ->
        io:format("process ~p: ~p~n", [Pid, R]), 
        receive_result(Ref)
    after 10 ->
        ok
    end.
best() ->
    APid = spawn(fun loop/0),
    BPid = spawn(fun loop/0),
    CPid = spawn(fun loop/0),

    Self = self(),
    Ref  = make_ref(),
    APid ! {Self, Ref, 2},
    BPid ! {Self, Ref, 3},
    CPid ! {Self, Ref, 4},

    receive_result(Ref).

Вы можете следовать этому небольшому коду. Результат:

9> wy:best().
process <0.77.0>: 4
process <0.78.0>: 9
process <0.79.0>: 16
ok
person BlackMamba    schedule 27.10.2014