Erlang - 为什么要创建一个新进程

时间:2013-12-12 14:44:51

标签: process erlang pid

我正在尝试使用此处的代码创建一个计数器

-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的新计数器进程。为什么是这样?我只想尝试一个计数器

3 个答案:

答案 0 :(得分:0)

这是测试中的常用技巧,尤其是在unit testing中,称为fixture。 Fixture是如何从已知状态测试某些有状态代码(在您的情况下为计数器)的方法。在这种情况下它是初始状态。

答案 1 :(得分:0)

您还期待什么? counter:start()每次调用时都会启动一个新进程。

start() ->
    spawn(counter, loop, [0]).

您可能想要使用:register/2

答案 2 :(得分:0)

Erlang的spawn函数创建进程(参见文档:http://erldocs.com/R16B02/erts/erlang.html?i=2&search=spawn#spawn/3

如果您想要唯一地标识您的反制服务器,您可以查看register。它将使您能够将pid绑定到一个原子,然后在您的消息中使用此atom而不是pid。