Concurrency 如何使“长生不老药”的过程状态始终处于打开状态?

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

我有一个简单的程序,当给定一个包含{pid,integer}的元组消息时,它会将一个带有pid和integer+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}


谢谢您抽出时间。

发送
当作乒乓球游戏。规则是:一次发送⇒ 一次消费。正如在乒乓球比赛中一样,不能指望对方同时发球十个球,做出正确的行为

要实现您想要的功能,您需要一个
GenServer
,它收集所有接收到的消息(而不是立即回复每个消息)

它还将提供,例如,
get_all
调用,该调用将从其状态检索所有收集的消息,并使用
{int,list}
元组进行响应:

{PID, [msg1, msg2, ..., msgN]}
这个方法的实现不适合这里的空白,但既然你的问题已经被标记了,教程将是一个很好的开始。那么你可能想读一读关于保持状态的书


另一种方法(我不推荐)是
flush()。空队列将触发超时。但是,这又不是应该怎么做的,因为您可能希望所有已发送的消息都以某种方式在另一端收集