资料:
在 Erlang 进程间的消息是一个有效的 Erlang 字串,即,它们可以是列表、元组、整数、 元子、pid 等等。
每个进程对于它收到的消息,有一个自己的输入队列。新的消息会放在队列的尾部。当一个 进程执行了一个 receive, 队列中第一个与匹配条件一致的消息就会从队列中移除,并匹 配的动作会执行。
如果第一个匹配试没有被匹配的话,第二个就会被检验,如果与队列中移除的条件匹配了的 话, 相对于第二个式子中的运作会被执行。第三个也依次类推。 如果没有匹配的话,那么第 一个消 息就会被放回队列中,并用第二个消息来做对应的操作。如果第二个消息匹配的话, 相应的动作 就会被执行,并把第二个消息从队列中移除(并保留第一个消息和其它的消息在队列中)。如果第 二个消息也不匹配,我们会试着用第三个消息,直到达到队列尾。如果到达到队列尾部,进程就会 阻塞(中止执行)并等待,直到一个新的消息被收到,上面的过程重复。
example pingpong.erl
-module(pingpong).
-compile([export_all]).
ping(0, Pong_PID) ->
Pong_PID ! finished,
io:format("ping finished~n", []);
ping(N, Pong_PID) ->
Pong_PID ! {ping, self()},
receive
pong ->
io:format("ping reveive pong~n", [])
end,
ping(N-1, Pong_PID).
pong() ->
receive
finished ->
io:format("pong finished~n", []);
{ping, Ping_PID} ->
io:format("pong reveive ping~n", []),
Ping_PID ! pong,
pong()
end.
start() ->
Pong_PID = spawn(pingpong, pong, []),
spawn(pingpong, ping, [3, Pong_PID]).