erlang并发的特征

  • 使用进程而非线程
  • 使用消息传递机制

简单Echo:并发与消息传递原语

在Erlang 中定义一个进程,这个进程所做的事情极为简单:接受一个字符串,然后输出出来。

1
2
3
4
5
6
7
8
9
10
% echo.erl
-module(echo).
-export([echo/0]).

echo() ->
receive
Message ->
io:format("recv: ~s~n", [Message]),
echo()
end.

要如何使用这个新定义的函数, 使用erlang的REPL。

1
2
3
4
5
6
7
8
9
10
11
12
$ erl
Erlang/OTP 20 [erts-9.2] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

Eshell V9.2 (abort with ^G)
1> c(echo).
{ok,echo}
2> Pid = spawn(fun echo:echo/0)
2> .
<0.67.0>
3> Pid!"something".
recv: something
"something"

(讲道理,用点作为语句结尾确实非常不习惯。)

返回结果的Echo

上面提到的函数并不能给函数返回结果。

1
2
3
4
5
6
7
8
9
10
11
% echo_server.erl
-module(echo_server).
-export([echo/0]).

echo() ->
receive
{Pid, Message} ->
Pid!Message,
io:format("recv: ~s~n", [Message]),
echo()
end.

为了能拿到这次Echo返回的结果,我们需要重新定义一个模块。

1
% echo_client.erl

同步返回结果的Echo

总结