我应该为这样的模块使用什么OTP行为?

时间:2012-06-05 02:42:07

标签: erlang otp

我有简单的erlang模块,我想根据OTP原则重写它。但我无法确定应该使用哪种选择模板。

模块代码:

-module(main).

-export([start/0, loop/0]).

start() -> 
    Mypid = spawn(main, loop, []),
    register( main, Mypid).

loop() ->
    receive
        [Pid, getinfo] -> Pid! [self(), welcome],
            io:fwrite( "Got ~p.~n", [Pid] ),
            // spawn new process here
            loop();
        quit -> ok;
        X ->
            io:fwrite( "Got ~p.~n", [ X ] ),
            // spawn new process here
            loop()
    end.

1 个答案:

答案 0 :(得分:3)

gen_server没问题。

夫妻俩:

  • 向自己发送消息是不好的做法
  • 消息通常是元组而不是列表,因为它们不是动态的
  • 尽管你发表了评论,但你并没有产生新的过程。 call to loop / 0进入相同的循环。

Gen_server init会保存你的start / 0体。 API调用序列并通过gen_server将您的调用代理到handle_calls。要在函数调用上生成新进程,请将spawn函数添加到所需handle_call的主体。不要使用handle_info来处理传入的消息 - 而不是发送它们调用gen_server API并将你的调用“转换”为gen_server:call或cast。 e.g。

start_link() ->
    gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).

init(_) ->
    {ok, #state{}}

welcome(Arg) ->
   gen_server:cast(?MODULE, {welcome, Arg}).

handle_cast({welcome, Arg},_,State) ->
  io:format("gen_server PID: ~p~n", [self()]),
  spawn(?MODULE, some_fun, [Arg]),
  {noreply, State}

some_fun(Arg) ->
  io:format("Incoming arguments ~p to me: ~p~n",[Arg, self()]).

我上面从未编译过,但它应该给你这个想法。