0

我正在尝试学习 Erlang 货币编程。

这是一个从 Erlang.org 获得的示例程序,但没有关于如何运行它的说明。

我以这种方式运行它,

1> counter:start() 
<0.33.0>

但是,我不知道如何运行其他函数,以便进程 (counter:start()) 可以根据收到的消息完成工作。

如何确认确实生成了两个或多个进程?

另一个问题,如何在函数中打印收到的消息?

 -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.

任何帮助将不胜感激。

谢谢

4

2 回答 2

2

其他函数将只使用您刚刚创建的模块,如下所示:

C = counter:start(),
counter:increment(C),
counter:increment(C),
io:format("Value: ~p~n", [counter:value(C)]).

您可以运行pman:start()以调出(GUI)进程管理器以查看您拥有哪些进程。

于 2012-04-20T06:49:04.077 回答
2

除了 Emil 所说的之外,您还可以使用该i()命令来验证哪些进程正在运行。让我们启动三个计数器:

1> counter:start().
<0.33.0>
2> counter:start().
<0.35.0>
3> counter:start().
<0.37.0>

并运行i()

...
<0.33.0>              counter:loop/1                         233        1    0
                      counter:loop/1                           2              
<0.35.0>              counter:loop/1                         233        1    0
                      counter:loop/1                           2              
<0.37.0>              counter:loop/1                         233        1    0
                      counter:loop/1                           2              
...

如您所见,上述进程(33、35 和 37)正在愉快地运行,它们正在执行 counter:loop/1 函数。让我们停止进程 37:

4> P37 = pid(0,37,0).
<0.37.0>
5> counter:stop(P37).
stop

检查新的进程列表:

6> i().

你应该确认它已经消失了。

于 2012-04-20T07:48:35.107 回答