Как написать простой цикл приема в Erlang - PullRequest
1 голос
/ 09 июля 2009

Давайте предположим, что у меня есть 2 процесса в Erlang, и у каждого процесса работает цикл приема. Я хочу послать сигнал от 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 ]

7 голосов
/ 09 июля 2009

Вы действительно должны создавать приложение OTP, а процесс B должен быть gen_server.

Семантика отправки сообщений и создание ваших собственных протоколов отправки / получения очень хороши, но если вы действительно не знаете, что делаете, вы начнете создавать не обслуживаемые серверы.

Я бы посоветовал сесть и разобраться, как сделать ваше приложение правильно структурированным стандартным OTP-приложением, чтобы вы запускали Yaws как часть дерева приложений и делали все остальное с ProcessA и ProcessB внутри обычной OTP-структуры.

6 голосов
/ 09 июля 2009

вы можете заменить формат io: на атом вроде nop

3 голосов
/ 09 июля 2009

Как сказал Симеон Пилигрим, вы можете сделать

receive   
    {message_from_process_b} -> ok
end,  

Но вы можете добавить тайм-аут:

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

для того, чтобы не получать сообщение (т. Е. Неисправность в датчике).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...