Process 向不同节点上的进程广播

Process 向不同节点上的进程广播,process,erlang,broadcast,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

我有一个功能可以进行广播:

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}]}]}

我不能对这个错误耿耿于怀。为什么这不起作用?

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

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

采用与相同的参数。该文档指定目标可以是以下之一:

  • pid
  • 港口
  • atom,表示在本地节点上注册的进程
  • {RegName,Node}
    ,用于在远程节点上注册的进程
您正在向
节点()的返回值的元素发送消息。这些是原子,但它们是节点名,而不是本地注册的进程。如果要将消息发送到的进程在远程节点上注册为
foo
,请写入
{foo,P}!{self(),Msg,Reason}


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

采用与相同的参数。该文档指定目标可以是以下之一:

  • pid
  • 港口
  • atom,表示在本地节点上注册的进程
  • {RegName,Node}
    ,用于在远程节点上注册的进程
您正在向
节点()的返回值的元素发送消息。这些是原子,但它们是节点名,而不是本地注册的进程。如果要将消息发送到的进程在远程节点上注册为
foo
,请写入
{foo,P}!{self(),Msg,Reason}

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

broadcast(Reason, Msg)