Concurrency 如何使“长生不老药”的过程状态始终处于打开状态?
我有一个简单的程序,当给定一个包含{pid,integer}的元组消息时,它会将一个带有pid和integer+1的消息发送回处理器。问题是我需要让这个程序保持活动状态,这样我就可以向它发送多条消息,然后当我刷新()它时,它会立即发回它的邮箱。它一次只能处理一条消息。我尝试了递归,但不起作用。这是我的Concurrency 如何使“长生不老药”的过程状态始终处于打开状态?,concurrency,process,elixir,pid,Concurrency,Process,Elixir,Pid,我有一个简单的程序,当给定一个包含{pid,integer}的元组消息时,它会将一个带有pid和integer+1的消息发送回处理器。问题是我需要让这个程序保持活动状态,这样我就可以向它发送多条消息,然后当我刷新()它时,它会立即发回它的邮箱。它一次只能处理一条消息。我尝试了递归,但不起作用。这是我的 defmodule Spawner do def start() do spawn(fn -> receive do {pid,y} -> s
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}
谢谢您抽出时间。把
发送
当作乒乓球游戏。规则是:一次发送⇒ 一次消费。正如在乒乓球比赛中一样,不能指望对方同时发球十个球,做出正确的行为
要实现您想要的功能,您需要一个GenServer
,它收集所有接收到的消息(而不是立即回复每个消息)
它还将提供,例如,get_all
调用,该调用将从其状态检索所有收集的消息,并使用{int,list}
元组进行响应:
{PID, [msg1, msg2, ..., msgN]}
这个方法的实现不适合这里的空白,但既然你的问题已经被标记了,教程将是一个很好的开始。那么你可能想读一读关于保持状态的书
另一种方法(我不推荐)是
flush()。空队列将触发超时。但是,这又不是应该怎么做的,因为您可能希望所有已发送的消息都以某种方式在另一端收集