【问题标题】:In Erlang, passing a message to all elements of a list of pids在 Erlang 中,将消息传递给 pid 列表的所有元素
【发布时间】:2015-03-24 01:02:42
【问题描述】:

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

我尝试使用辅助函数无济于事,列表推导使我陷入无限循环,因此我正在研究如何使用 lists:foreach 来解决这个问题。 我对函数式编程相当陌生,但据我了解,这个 foreach 需要接收列表以及 lambda-calculus 函数来向列表中的每个节点发送消息。由于“!”的中缀性质,我还没有找到一种不会导致语法错误的方法。

【问题讨论】:

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


    【解决方案1】:

    您是如何在列表理解中实现无限循环的?我必须说,这很有挑战性。试试这个:

    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).
    

    【讨论】:

    • 非常感谢您的帮助!我意识到我说反了;我的辅助函数让我陷入无限循环,我一直在尝试列表理解无济于事......我现在冻结的代码 sn-p 如下: Message = {self(),continue} , io:format("到了 1"), [X !留言 || X
    • @JBarnett 我帮不了你。你只给我看了一小段代码,我不知道为什么它不起作用。没有办法在这里冻结,因为它只是发送消息。如果您的代码很短,请编辑您的问题。编辑:有什么错误吗?如果 Pids 不是列表或 X 不是 pid 那么这应该崩溃......你是否以某种方式监控这些进程?如果你知道它的 pid,那么试试 is_process_alive(ItsPid)。
    猜你喜欢
    • 2014-09-17
    • 2016-11-13
    • 1970-01-01
    • 2011-03-10
    • 2013-10-27
    • 1970-01-01
    • 2016-04-30
    • 2018-09-10
    • 2018-04-08
    相关资源
    最近更新 更多