2016-05-08 5 views
0

私はこのエリクールのコードで何が起こっているのか理解しようとしています。 2つのプロセスが生成された後、生成されたプロセスは送信者にメッセージをエコーし​​ますが、iexではメッセージが1つしか表示されません。どうしましたか?送信されたプロセスメッセージが送信者によって再度受信されないのはなぜですか?

defmodule TwoPs do 
    # a simple echo function - take a pid to send message back to 
    def echo(pid) do 
    #wait till the spawned process receives a message, turn around and echo it back to the sender 
    receive do 
     msg -> 
     IO.puts("Received #{msg}") 
     send pid, {:ok, "Hello #{msg}"} 
    end 
    end 

    #spawn's two processes and sends a message to both...expects an echo back from both spawned processes 
    def create_ps() do 
    #spawn the two processes 
    p1 = spawn(TwoPs, :echo, [self]) 
    p2 = spawn(TwoPs, :echo, [self]) 

    #send a message to the first pid 
    send p1, "World" 

    #receive message back from spawned child 1 
    receive do 
     {:ok, msg} -> "#{msg}" 
    end 

    #send a message to the second pid 
    send p2, "Bob" 

    #receive message from the spawned child 2 
    receive do 
     {:ok, msg} -> "#{msg}" 
    end 

    end 

end 

IEXでの出力は常に "こんにちはボブ" 私たちは、 "Hello World" の表示されないのはなぜ

iex(17)> TwoPs.create_ps 
Received World 
Received Bob 
"Hello Bob" 

のですか?

答えて

1

戻り値はTwoPs.create_ps/0で、この場合は2番目の受信ブロックから返された値です。あなたが受け取った値の両方を印刷したい場合は、明示的IO.puts/2でそれらを印刷する必要があります:

defmodule TwoPs do 
    def echo(pid) do 
    receive do 
     msg -> 
     IO.puts("Received #{msg}") 
     send pid, {:ok, "Hello #{msg}"} 
    end 
    end 

    def create_ps() do 
    p1 = spawn(TwoPs, :echo, [self]) 
    p2 = spawn(TwoPs, :echo, [self]) 

    send p1, "World" 
    receive do 
     {:ok, msg} -> IO.puts "#{msg}" 
    end 

    send p2, "Bob" 
    receive do 
     {:ok, msg} -> IO.puts "#{msg}" 
    end 
    end 
end 

をテスト:

iex(1)> TwoPs.create_ps 
Received World 
Hello World 
Received Bob 
Hello Bob 
:ok 
+0

ありがとうございました。驚くほど速い応答。完全にそれを逃した。私の部分ではダムの間違い – sat

関連する問題