2009-07-09 7 views
1

Erlang에서 2 개의 프로세스가 있으며 각 프로세스마다 수신 루프가 실행 중이라고 가정 해 보겠습니다. 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 라인을 사용하지 않고 어떻게 작성할 수 있습니까? (B에서 ​​메시지를받을 때까지 프로세스 A가 필요합니다. 이것은 Yaws/Yapp의 큰 부분이며 페이지를 표시하기 전에 서버에서 응답해야합니다.)

답변

6

io : 형식을 다음과 같이 바꿀 수 있습니다. 원자처럼 nop

7

당신은 정말로 OTP 응용 프로그램을 구축해야하고 프로세스 B는 gen_server 여야합니다.

메시지 전송 의미론 및 직접 보내기/받기 프로토콜은 모두 매우 훌륭하지만 실제로 무엇을하는지 알지 못하면 유지가 불가능한 서버를 구축하기 시작합니다.

내 조언은 응용 프로그램 트리의 일부로 Yaws를 시작하고 일반 OTP 프레임 워크 내에서 ProcessA 및 ProcessB를 사용하여 다른 모든 작업을 수행 할 수 있도록 응용 프로그램을 올바르게 구조화 된 표준 OTP 응용 프로그램으로 만드는 방법을 설명합니다. . 시므온 순례자 말했듯이

+0

감사합니다. 나는 그것을 계획한다. 나는 여전히 Erlang을 배우고 있으며 조 (Joe)의 책조차도 그가 코드를 작성한 다음 OTP의 모든 것을 그것의 주위에 두는 것에 대해 언급합니다. 무슨 일이 일어나는 지 알고 싶습니다. 나는 gen_server와 supervisors를 이해하지만 처음부터 아직 구현하지 않았습니다. 확실히 - 조언 해 주셔서 감사합니다. – marcc

+0

그래, 조는 실제로 OTP를 사용하지 않는다는 것이 문제 다. 그는 항상 자신의 서버를 굴린다 : (어리석게도 그는 스톡홀름의 Erlang User Conference에서 다른 해에 모두 그를 때렸다.) 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

관련 문제