1.知识引入
(1)创建进程:spawn(Module , Function , Arguments),返回新进程的pid
(2)给进程发送消息:Pid ! Message。其中Pid绑定的是接收者的pid,Message是消息,消息会发送到接收者的邮箱中。
(3)接受消息:receive子句。具体用法参考下述代码和例子。
receive
Pattern1 when Guard1 -> exp11, .., exp1n;
Pattern2 when Guard2 -> exp21, .., exp2n;
...
Other -> expn1, .., expnn
end
2.例子
-module (test).
-export ([start/0, loop/0]).
start() ->
ChildPid = spawn (test, loop, []),
ChildPid ! {self(), hello},
receive
{Pid, Msg} ->
io:format("~w~n", [Msg])
end,
ChildPid ! stop.
loop() ->
receive
{From, Msg} ->
From ! {self(), Msg},
loop();
stop ->
done
end.
编译后调用test:start(),流程如下:
父进程进入start()函数后创建子进程(line5),子进程执行test模块的loop函数,子进程遇到receive子句时(line14)检查其邮箱是否有消息,发现为空(因为尚无发给它的消息)于是挂起。而父进程创建子进程后向子进程发送一则消息(line6),注意这则消息包含了父进程的pid(通过self()函数获取),随后父进程遇到receive子句(line7)挂起。子进程收到来自父进程的消息后结束挂起,通过模式匹配进入{From,Msg}子句,向父进程发送一则消息(line16)随后执行loop()继续等待消息。因等待消息而挂起的父进程收到子进程的消息后激活,父进程通过模式匹配进入到相应子句输出信息(line9),然后向子进程发送一则消息,通知子进程结束。子进程收到此消息进入到stop子句(line18),结束任务。
初学Erlang,烦请指教^_^