【问题标题】:Erlang: How to receive a message only from a specific sender?Erlang:如何只接收来自特定发件人的消息?
【发布时间】:2019-03-17 17:54:47
【问题描述】:

在 Erlang 中,如何接收来自特定 pid 的消息?

【问题讨论】:

    标签: erlang message-passing


    【解决方案1】:

    这里有几种方法:

    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】:

      您需要在消息中包含发送者的 pid,并在接收过程中与之匹配。

      【讨论】:

        猜你喜欢
        • 2015-06-26
        • 2013-07-15
        • 1970-01-01
        • 2016-10-04
        • 2021-05-28
        • 2019-11-20
        • 2012-10-04
        • 2020-10-26
        • 2014-02-18
        相关资源
        最近更新 更多