2017-03-04 5 views
1

{pid, integer}를 포함하는 tupple 메시지가 주어지면 PID와 interger + 1을 사용하여 메시지를 프로세서로 다시 보내는 간단한 프로그램이 있습니다. 문제는 내가 여러 메시지를 보낼 수 있도록이 프로그램을 활성 상태로 두어야한다는 것입니다. 그런 다음 flush() 할 때 한 번에 사서함을 모두 보냅니다. 한 번에 1 개의 메시지 만 처리합니다. 재귀를 시도했지만 작동하지 않습니다. 여기에 내가 가진 것이있다. 나는 어떻게 엘릭서를 항상 on 상태로 유지하나요?

defmodule Spawner do 
    def start() do 

    spawn(fn -> 
     receive do 
     {pid,y} -> send(pid,y+1) 
     Spawner.start() 
     end 
    end) 

    end 
end 

그런 다음 터미널에서 내가 할 것 :

> x = Spawner.start() 
> send x, {self(),3} 
> send x, {self(),5} 
> flush() 
#⇒ output: {PID,4} 

나는 {PID,4}{PID,6}로 출력이 필요합니다.

감사합니다.

답변

2

약 탁구 게임에 관해서 send를 생각해라. 규칙은 : ⇒ 하나는 소비합니다. 탁구와 마찬가지로 반대편에서 적절한 동작을 기대할 수 없으며 한 번에 10 개의 공을 제공합니다.

당신이 모든 수신 된 메시지 수집하는 GenServer 것을해야 할 것 원하는 것을 달성하기 위해 (그들 각각에 대답 대신 즉시 합니다.) 또한

가 제공 할 것, 말, get_all 전화를 , 그게 상태의에서 수집 된 모든 메시지를 검색하고 {int, list} 튜플로 응답 할 것이다 :

{PID, [msg1, msg2, ..., msgN]} 

여기 여백에 맞게,하지만 이후하지 않을 것이다 구현 귀하의 질문에 , GenServer 태그가 붙어 있으면 좋은 시작이 될 것입니다. 그런 다음 상태를 유지하기 위해 약 Agent을 읽는 것이 좋습니다.


다른 방법 라운드 (내가하지 않는 것이 좋습니다) flush() 타임 아웃에 반복적으로 소비 될 것이다. 빈 큐가 시간 초과를 트리거합니다. 그러나 다시 한 번 말하지만, 어떻게해야하는지는 아닙니다. 이미 보낸 메시지를 다른 쪽에서 어떻게 든 수집하기를 원하기 때문입니다.

+0

놀랍습니다. 도움을 주셔서 감사합니다. –