我是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
但我认为应该不断打印输出,直到我停止程序。 上面的代码会出现什么问题?
答案 0 :(得分:4)
这是因为Erlang VM在执行Pingpong.start
后退出,因为主进程没有任何代码可以执行。如果您添加:timer.sleep(:infinity)
以确保主要流程不会退出,您应该会看到永久连续打印ping
和pong
:
$ elixir -r pingpong.exs -e "Pingpong.start; :timer.sleep(:infinity)"