【问题标题】:Broadcasting to processes that are on different nodes广播到不同节点上的进程
【发布时间】:2014-04-14 19:51:09
【问题描述】:

我有一个广播功能:

broadcast(Msg, Reason) ->
    Fun = fun(P) -> P ! {self(), Msg, Reason} end, %line 27
    lists:foreach(Fun, nodes()).

但它不起作用,我收到此错误:

=ERROR REPORT==== 12-Apr-2014::15:42:23 ===
Error in process <0.45.0> on node 'sub@Molly' with exit value: {badarg,[{subscri
ber,'-broadcast/2-fun-0-',3,[{file,"subscriber.erl"},{line,27}]},{lists,foreach,
2,[{file,"lists.erl"},{line,1323}]},{subscriber,loop,0,[{file,"subscriber.erl"},
{line,38}]}]}

第 38 行是我调用函数的地方

broadcast(Reason, Msg)

我无法解决这个错误。为什么这不起作用?

【问题讨论】:

    标签: process erlang broadcast


    【解决方案1】:

    ! 采用与erlang:send/2 相同的参数。文档指定目标可以是以下之一:

    • 一个pid
    • 一个端口
    • 原子,表示在本地节点上注册的进程
    • {RegName, Node},用于在远程节点上注册的进程

    您正在向返回值nodes() 的元素发送消息。这些是原子,但它们是节点名称,而不是本地注册的进程。如果要向其发送消息的进程在远程节点上注册为foo,请改写{foo, P} ! {self(), Msg, Reason}

    另一方面,如果您有远程节点上进程的 pid,则无需指定节点名称,因为 pid 包含该信息。只需像发送本地 pid 一样将消息发送到远程 pid。

    【讨论】:

      【解决方案2】:

      节点只是一个原子,你不能向它发送消息。您需要的是该节点上的 pid。例如,它可以是一个注册的进程,并且可以通过调用 rpc:call(Node, erlang, where, [Name]) 来获取 pid。另一种选择是使用 gproc。

      【讨论】:

        猜你喜欢
        • 2021-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多