广播到不同节点上的进程

时间:2014-04-12 13:46:45

标签: process erlang broadcast

我有一个播放广播的功能:

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)

我无法绕过错误。为什么这不起作用?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

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

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

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