【问题标题】:Erlang - why is a new process being createdErlang - 为什么要创建一个新进程
【发布时间】:2013-12-31 01:01:15
【问题描述】:

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

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

【问题讨论】:

    标签: process erlang pid


    【解决方案1】:

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

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

    【讨论】:

    • 我已经使用寄存器将计数器 pid 绑定到原子面包。但现在我不确定如何实际使用注册名称。以以下形式发送消息:面包!增量似乎不起作用,我不能再使用 counter:increment(bread)
    • 使用注册名作为pid。这里:true = erlang:register(shell, self()), shell ! hello, flush().
    【解决方案2】:

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

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

    您可能想使用:register/2

    【讨论】:

    • 但是当我为Counter分配一个进程ID时,下次我为Counter分配一个不同的PID时,它不应该抛出一个错误吗?我不认为这是可能的。我在这里显然误解了我也尝试过使用 register 的东西,但是当我将它注册为某物/任何东西(例如:面包)时,它似乎不再起作用。我不能打电话:计数器:增量(面包)。 ,它只是卡住了。
    • 所以我可以使用 register(bread, counter:start()) 然后增加它,使用类似:bread!增量。在这种情况下
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2010-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-02
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      • 2014-06-15
      相关资源
      最近更新 更多