【问题标题】:How do i make a process state always on for elixir?我如何使长生不老药的进程状态始终处于开启状态?
【发布时间】:2017-03-04 04:25:29
【问题描述】:

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

感谢您的宝贵时间。

【问题讨论】:

    标签: concurrency process elixir pid


    【解决方案1】:

    send 视为乒乓球比赛。规则是:一次发送⇒一次消耗。就像在乒乓球中一样,不能指望对方的正确行为,一次发十个球。

    要完成您想要的,您将拥有一个GenServer,它收集所有收到的消息(而不是立即回答每个消息。)

    它还会提供,比如说,get_all 调用,它会从它的状态中检索所有收集到的消息,并以 {int, list} 元组进行响应:

    {PID, [msg1, msg2, ..., msgN]}
    

    它的实现不适合这里的边距,但既然你的问题用 标记,GenServer 教程将是一个好的开始。然后你可能想了解Agent 来保持状态。


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-01
      • 2014-06-28
      • 1970-01-01
      相关资源
      最近更新 更多