2017-03-04 55 views
1

我有一個簡單的程序,當給出一個包含{pid,integer}的tupple消息時,它將發送一條消息返回給處理器,其PID和整數+1。問題是我需要這個程序保持活動狀態,所以我可以發送多條消息,然後當我flush()它時,會一次發回它的郵箱。它一次只能處理1條消息。我嘗試了遞歸,但它不起作用。這是我的。我如何使靈藥始終處於進程狀態?

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

你真了不起,謝謝你的幫助 –

相關問題