【问题标题】:How to write a simple receive loop in Erlang如何在 Erlang 中编写一个简单的接收循环
【发布时间】:2009-07-09 22:23:20
【问题描述】:

假设我在 Erlang 中有 2 个进程,每个进程都有一个接收循环运行。我想从 ProcessB 向 ProcessA 发送一个信号,但 ProcessA 实际上不需要对它做任何事情。 ProcessA 只需要知道 ProcessB 发送的消息。

这是我目前的实现方式:

receive   
    {message_from_process_b} ->  
        io:format("received a message from b", []);  
end,  
%% at this point I know that I've received the message from B.  

它工作正常。但出于好奇,如果没有io:format 行,我怎么能写这个? (我需要进程 A 阻塞,直到收到来自 B 的消息,这是更大的 Yaws / Yapp 的一部分,服务器需要响应才能显示页面。)

【问题讨论】:

    标签: erlang


    【解决方案1】:

    您确实应该构建一个 OTP 应用程序,而进程 B 应该是一个 gen_server。

    消息发送语义和构建您自己的发送/接收协议都非常好,但除非您真的知道自己在做什么,否则您将开始构建不可维护的服务器。

    我的建议是坐下来研究如何使您的应用程序成为结构正确的标准 OTP 应用程序,以便您将 Yaws 作为应用程序树的一部分启动,并在正常 OTP 框架内使用 ProcessA 和 ProcessB 执行所有其他工作。

    【讨论】:

    • 谢谢。我计划好了。我还在学习 Erlang,甚至 Joe 的书也提到他编写代码,然后将所有 OTP 的东西放在它周围。我正在采取这种方法来看看会发生什么。我了解 gen_server 和主管,但还没有从头开始实施。绝对 - 谢谢你的建议。
    • 是的,问题是 Joe 从来没有真正使用过 OTP——他总是使用自己的服务器 :( 他愚蠢地提到了前一年在斯德哥尔摩举行的 Erlang 用户大会,每个人都在这件事上大打出手。还有一本来自 O'Reilly 的新 Erlang 书amazon.co.uk/Erlang-Programming-Francesco-Cesarini/dp/…
    【解决方案2】:

    你可以用像 nop 这样的原子替换 io:format

    【讨论】:

      【解决方案3】:

      正如 Simeon Pilgrim 所说,你可以做到

      receive   
          {message_from_process_b} -> ok
      end,  
      

      但您可能想要添加超时:

      receive   
          {message_from_process_b} -> ok
          after 1000 -> io:format("timeout!", [])
      end,
      

      为了迎合从不接收消息(即发送器发生故障)。

      【讨论】:

      • 在这种情况下它可能应该抛出一个异常,否则它是一个静默失败。早点崩溃!
      猜你喜欢
      • 1970-01-01
      • 2011-01-13
      • 2019-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-20
      相关资源
      最近更新 更多