Эрланг: Как получить сообщение только от определенного отправителя? - PullRequest
0 голосов
/ 17 марта 2019

В Erlang, как я могу получить сообщение, отправленное с определенного pid?

Ответы [ 2 ]

3 голосов
/ 18 марта 2019

Вот несколько способов:

1) Отправьте целевому процессу секретный код, который он может отправить обратно со всеми своими сообщениями:

-module(my).
-compile(export_all).

worker(TargetPid, Msg, SecretId) ->
     TargetPid ! {Msg, SecretId}.

get_msg(SecretId) ->
    receive
        {Msg, SecretId} -> Msg
    end. 

test() ->
    SecretId = "A1!cd!",
    spawn(my, worker, [self(), hello, "Xy*d1"]),
    spawn(my, worker, [self(), goodbye, SecretId]),

    io:format("~w~n", [get_msg(SecretId)]).

В оболочке:

6> c(my).    
my.erl:2: Warning: export_all flag enabled - all functions will be exported
{ok,my}

7> my:test().
goodbye
ok

8> 

2) Вместо сопоставления с секретным кодом в предложении приема целевой процесс должен отправить сообщение, помеченное его Pid:

-module(my).
-compile(export_all).

get_msg(TargetPid) ->
    receive
        {Msg, TargetPid} -> Msg
    end. 

worker(TargetPid, Msg) ->
     TargetPid ! {Msg, self()}.

test() ->
    spawn(my, worker, [self(), hello]),
    Pid = spawn(my, worker, [self(), goodbye]),

    io:format("~w~n", [get_msg(Pid)]).

В оболочке:

3> c(my).
my.erl:2: Warning: export_all flag enabled - all functions will be exported
{ok,my}

4> my:test().
goodbye
ok

5> 
2 голосов
/ 17 марта 2019

Вам необходимо включить pid отправителя в сообщение и сопоставить его в процессе получения.

...