我正在尝试使用此处的代码创建一个计数器
-module(counter).
-export([start/0,loop/1,increment/1,value/1,stop/1]).
%% First the interface functions.
start() ->
spawn(counter, loop, [0]).
increment(Counter) ->
Counter ! increment.
value(Counter) ->
Counter ! {self(),value},
receive
{Counter,Value} ->
Value
end.
stop(Counter) ->
Counter ! stop.
%% The counter loop.
loop(Val) ->
receive
increment ->
loop(Val + 1);
{From,value} ->
From ! {self(),Val},
loop(Val);
stop -> % No recursive call here
true;
Other -> % All other messages
loop(Val)
end.
我在我的模块中使用的代码是(仅用于测试目的,因为我无法弄清楚它为什么这样做):
test3() ->
Counter = counter:start().
因此,每当我运行test3时,它都会创建一个带有新pid的新计数器进程。为什么是这样?我只想尝试一个计数器
答案 0 :(得分:0)
这是测试中的常用技巧,尤其是在unit testing中,称为fixture。 Fixture是如何从已知状态测试某些有状态代码(在您的情况下为计数器)的方法。在这种情况下它是初始状态。
答案 1 :(得分:0)
答案 2 :(得分:0)
Erlang的spawn
函数创建进程(参见文档:http://erldocs.com/R16B02/erts/erlang.html?i=2&search=spawn#spawn/3)
如果您想要唯一地标识您的反制服务器,您可以查看register。它将使您能够将pid绑定到一个原子,然后在您的消息中使用此atom而不是pid。