Elixir进程没有收到消息

时间:2016-09-14 01:33:27

标签: elixir

我是Elixir的新手,目前正在学习流程。在练习中,我写了一个ping pong程序,从2个进程打印“ping”和“pong”。收到1或2条消息后,进程总是死机。这是我的代码

defmodule Pingpong do
  def play do
    receive do
     {sender, :ping} ->
        IO.puts  "ping"
        send sender, {self, :pong}
        play
     {sender, :pong} ->
       IO.puts  "pong"
       send sender, {self, :ping}
       play
   end
  end

  def start() do
    a = spawn(Pingpong, :play, [])
    b = spawn(Pingpong, :play, [])
    send a, {b, :ping}
  end
end

有时我只得到一行输出

$ elixir -r pingpong.exs -e "Pingpong.start"
> ping

或多行然后停止

ping
pong
ping
pong
ping
pong

但我认为应该不断打印输出,直到我停止程序。 上面的代码会出现什么问题?

1 个答案:

答案 0 :(得分:4)

这是因为Erlang VM在执行Pingpong.start后退出,因为主进程没有任何代码可以执行。如果您添加:timer.sleep(:infinity)以确保主要流程不会退出,您应该会看到永久连续打印pingpong

$ elixir -r pingpong.exs -e "Pingpong.start; :timer.sleep(:infinity)"