如何在Erlang中编写一个简单的接收循环

时间:2009-07-09 03:49:03

标签: erlang

假设我在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的一部分,服务器需要响应才能显示页面。)

3 个答案:

答案 0 :(得分:7)

你真的应该构建一个OTP应用程序,而进程B应该是gen_server。

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

我的建议是坐下来找出如何使你的应用程序成为一个结构合理的标准OTP应用程序,这样你就可以将Yaws作为应用程序树的一部分启动,并在正常的OTP框架内完成ProcessA和ProcessB的所有其他工作。

答案 1 :(得分:6)

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

答案 2 :(得分:3)

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

receive   
    {message_from_process_b} -> ok
end,  

但您可能想要添加超时:

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

以满足从未接收消息(即敏感器中发生的故障)。