2013-12-12 3 views
1

хорошо я пытаюсь создать счетчик, используя код здесьErlang - почему новый процесс создается

-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, он создает новый процесс против с новым ПИД-регулятора. Почему это? Я просто пытаюсь использовать один счетчик

ответ

0

Это обычная техника при тестировании, особенно в unit testing, известная как fixture. Светильник - это способ, как проверить некоторый код состояния (как счетчики в вашем случае) из известного состояния. В этом случае это состояние init.

0

Что еще вы ожидаете? counter: start() будет запускать новый процесс каждый раз, когда вы его вызываете.

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

Вы можете использовать: register/2

+0

Но когда я назначаю идентификатор процесса счетчику, не должен ли он вызывать ошибку при следующем назначении счетчика другого ПИД-регулятора? Я не думал, что это возможно. Я явно недопонимаю здесь. Я тоже пробовал использовать регистр, но тогда, когда я регистрирую его как что-то/что-то (например: хлеб), он больше не функционирует. Я не могу позвонить: counter: increment (хлеб). , он просто застревает. – user1079404

+0

Так что я мог бы использовать, зарегистрируйтесь (хлеб, счетчик: start()) И затем, чтобы увеличить его, используйте что-то вроде: хлеб! приращение. В этом случае – user1079404

0

spawn функции Erlang создает процессы (см документа: http://erldocs.com/R16B02/erts/erlang.html?i=2&search=spawn#spawn/3)

Если вы хотите, чтобы однозначно идентифицировать встречный сервер, вы можете посмотреть на register. Это позволит вам связать pid с атомом, а затем использовать этот атом в ваших сообщениях вместо pid.

+0

Я использовал регистр, чтобы связать счетчик pid с атомом хлеба. Но теперь я не уверен, как на самом деле использовать зарегистрированное имя. Отправка сообщений в форму: хлеб! приращение не работает, и я больше не могу использовать счетчик: increment (bread) – user1079404

+0

Используйте зарегистрированное имя как pid. Здесь: 'true = erlang: register (shell, self()), shell! hello, flush(). ' – fenollp

Смежные вопросы