2017-03-04 32 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

你真了不起,谢谢你的帮助 –

相关问题