跳转到内容

Erlang 编程/进程

来自 Wikibooks,开放的书籍,开放的世界

Erlang 进程和消息

[编辑 | 编辑源代码]

在 Erlang 中,创建和控制进程非常容易。

程序 chain_hello.erl 构建了一个任意长度的进程链。每个进程创建一个进程,然后向其发送消息。该程序创建一个包含 N 个进程的链,每个进程输出 "hello world!<N>"(其中 <N> 是某个整数)。

进程彼此发送和接收消息。消息使用模式匹配读取。消息以 FIFO(先进先出)的方式匹配。

注意 1:最终输出的顺序取决于进程调度。

注意 2:时间向下流动(在每条垂直线上,参见注意 1)。

这是执行 chain_hello:start(1) 的进程消息图。

start(1)
   |
spawns -----------> listen(1)
   |                   |
   |                spawns --------------------> listen(0)
   |                   |                            |
   |                sends ----> speak ----------> prints --> "hello world 0"
   |                   |                            |
 sends --> speak --> prints --> "hello world 1"     |
                       |                            |
                       ok                           ok

程序清单:chain_hello.erl

-module(chain_hello). 
-compile(export_all).
                                                            %
start(N)->                                                  % startup
       Pid1 = spawn(chain_hello, listen, [N]),
       Pid1 ! speak,
       io:format("done \n").
                                                            %
listen(0)->                                                 % base case
       receive
                speak ->
                       io:format("hello world!~w\n", [0])
       end;
listen(N)->                                                 % recursive case
       Pid2 = spawn(chain_hello, listen, [N-1]),
       Pid2 ! speak,
       receive
               speak ->
                       io:format("hello world!~w\n", [N])
       end.
% ---- sample output ---- %
%
% 14> chain_hello:start(4).
% done
% hello world!4
% hello world!3
% hello world!2
% okhello world!1
% hello world!0
华夏公益教科书