我如何使灵药始终处于进程状态?
问题描述:
我有一个简单的程序,当给出一个包含{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}
。
谢谢你的时间。
答
想想send
作为乒乓球比赛。规则是:一个发送⇒一个消费。就像在乒乓球一样,不能指望对方的正确行为,一次服10个球。
来完成你想要什么,你将会有一个GenServer
是收集所有被接收消息(而不是立即回答他们每个人。)
而且它将提供,比方说,get_all
通话从它的状态会检索所有收集到的信息,并与{int, list}
元组回应:
{PID, [msg1, msg2, ..., msgN]}
的是,执行不适合这里的利润,但因为你有你的问题标签elixir,GenServer
教程将是一个好的开始。那么你可能想阅读约Agent
来保持这种状态。
其他方式(我不推荐它)将是flush()
消费者递归与超时。空队列会触发超时。但是,这又不是它应该如何完成的,因为你可能希望所有已经发送的消息以某种方式被收集在另一侧。
你真了不起,谢谢你的帮助 –