在Erlang中,将消息传递给pid列表的所有元素

时间:2015-03-23 02:59:16

标签: foreach erlang list-comprehension message-passing lambda-calculus

我正在尝试构建一个非常简单的屏障同步服务器,其中服务器最初被提供了许多将与之通信的进程。当一个过程完成后,它会收到一条带有该过程的消息。 Pid,它保留了每个进程的列表。当屏障达到零(所有进程都发送了消息)时,我的服务器需要向每个进程发送一条消息(我使用[Pid | ProcList]作为我的pids列表)。

我尝试使用辅助函数无济于事,列表推导使我处于无限循环中,因此我正在研究如何使用列表:foreach来处理这个问题。 我对函数式编程相当新,但从我的理解,这个foreach需要接受列表以及lambda演算函数来向列表中的每个节点发送消息。由于"!"的中缀性质,我还没有找到一种方法来做到这一点而不会导致语法错误。

1 个答案:

答案 0 :(得分:4)

你是如何在列表理解中做出无限循环的?我必须说,这是非常具有挑战性的。试试这个:

Message = % broadcast message goes here
ListOfPids = % list of recipients
[Pid ! Message || Pid <- ListOfPids].

如果你想使用foreach,那么它需要一个参数函数作为第一个参数,所以需要首先包装send,因为它是两个参数函数。

Message =  % broadcast message goes here
ListOfPids = % list of recipients
Fun = fun (Pid) -> Pid ! Message end,
lists:foreach(Fun, ListOfPids).