下面是erlang教程的一份代码,其中创建了两个进程,其中一个重复向另一个发送消息。
module(tut15).
-export([start/0, ping/2, pong/0]).
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 received pong~n", [])
end,
ping(N - 1, Pong_PID).
pong() ->
receive
finished ->
io:format("Pong finished~n", []);
{ping, Ping_PID} ->
io:format("Pong received ping~n", []),
Ping_PID ! pong,
pong()
end.
start() ->
Pong_PID = spawn(tut15, pong, []),
spawn(tut15, ping, [3, Pong_PID]).
-module(tut4). %模块名字为tut4
-export([start/0,ping/2,pong/0]). %导出函数 start函数参数0个 ping函数参数2个 pong函数参数0个
ping(0,Pong_PID)-> %如果ping的第一个参数是0,
Pong_PID ! finished, %向pid为Pong_PID的进程发送finised消息
io:format("ping finished~n",[]);%格式化输出一条信息
ping(N,Pong_PID)-> %如果ping的第一个参数不是0
Pong_PID ! {ping,self()}, %向pid为Pong_PID的进程发送消息,消息格式为{ping,pid},self()返回当前进程的pid
receive %接受消息
pong-> %接受的消息如果是pong
io:format("Ping recevived pong~n",[]) %格式化输出一条消息,注意,end之前没有标点符号
end,
ping(N-1,Pong_PID). %N-1然后继续调用ping
pong()->
receive %接受消息
finished-> %如果接收的消息是finised
io:format("Pong finished~n",[]); %格式化输出一条消息
{ping,Ping_PID}-> %如果接收的消息是{ping,pid}这种格式的消息
io:format("Pong received ping~n",[]), %格式化输出一条消息
Ping_PID ! pong, %向pid为Ping_PID的进程发送一个pong消息
pong() %继续调用pong。注意,end前面没有标点符号 也就是说,只有当pong接收到一个{ping,pid}消息时,才向ping发送消息并继续调用自己
end.
start()->
Pong_PID = spawn(tut4,pong,[]), %创建一个进程,并返回pid
spawn(tut4,ping,[3,Pong_PID]). %创建另一个进程