2009-07-09 3 views
1

Предположим, что у меня есть 2 процесса в Erlang, и каждый процесс имеет цикл приема. Я хочу отправить сигнал ProcessB в ProcessA, но ProcessA фактически не должен ничего с ним делать. ProcessA должен знать, что ProcessB отправил сообщение.Как написать простой цикл приема в Erlang

Вот как я это реализуется в настоящее время:

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, и серверу требуется ответ, прежде чем он сможет отобразить страницу.)

ответ

6

Вы можете заменить формат io: atom like nop

7

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

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

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

+0

Спасибо. Я планирую это. Я все еще изучаю Эрланг, и даже книга Джо упоминает, что он пишет код, а затем кладет на него все вещи OTP. Я беру этот подход, чтобы посмотреть, что произойдет. Я понимаю gen_server и супервизоров, но еще не реализовал его с нуля. Определенно - благодарю вас за совет. – marcc

+0

Да, проблема в том, что Джо никогда не использует OTP - он всегда закатывает свои собственные серверы: (Он глупо упомянул, что на Конференции пользователя Erlang в Стокгольме другой год и все его избили). Также есть новая книга Эрланг от O'Reilly http://www.amazon.co.uk/Erlang-Programming-Francesco-Cesarini/dp/0596518188/ref=sr_1_1?ie=UTF8&s=books&qid=1247175390&sr=8-1 –

3

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

receive 
    {message_from_process_b} -> ok 
end, 

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

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

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

+0

В таком случае это должно быть выбросить исключение, в противном случае это тихий сбой. – Christian