2016-09-14 16 views
0

私はエリクシールには新しく、最新のプロセスについて学んでいます。練習では、私は2つのプロセスから "ping"と "pong"を印刷する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 

を停止した。しかし、私はそれが継続的にIまでの出力を印刷すべきだと思いますプログラムを停止します。 上記のコードで何が問題になることがありますか?

答えて

3

これは、Pingpong.startを実行した後にErlang VMが終了するため、メインプロセスに実行されるコードが残っていないためです。あなたがメインのプロセスが終了しないことを確認する:timer.sleep(:infinity)を追加する場合は、pingpongが連続的に永遠に印刷されているはずです。 `

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

こと:timer.sleep(無限大)は'それを修正しました。ありがとうございました! –

関連する問題