我有一个播放广播的功能:
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)
我无法绕过错误。为什么这不起作用?
答案 0 :(得分:2)
Node只是一个原子,你无法向它发送消息。你需要的是该节点上的pid。例如,它可以是一个注册过程,可以通过调用rpc:call(Node,erlang,where,[Name])获得pid。另一种选择可能是使用gproc。
答案 1 :(得分:2)
!
采用与erlang:send/2相同的参数。文档指定目标可以是以下之一:
{RegName, Node}
,用于在远程节点上注册的进程您正在向nodes()
的返回值元素发送消息。这些是原子,但它们是节点名称,而不是本地注册的进程。如果要将消息发送到的进程在远程节点上注册为foo
,请改为编写{foo, P} ! {self(), Msg, Reason}
。
另一方面,如果您在远程节点上有进程的pid,则无需指定节点名称,因为pids包含该信息。只需将消息发送到远程pid,就像发送本地pid一样。