1

シンプルなerlangモジュールがあり、OTPの原則に基づいて書き直したいと思います。しかし、どのoptテンプレートを使用すべきかを判断できません。

モジュールのコード:

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

1 に答える 1

3

gen_serverで問題ありません。

カップルのもの:

  • 自分にメッセージを送るのは悪い習慣です
  • メッセージは動的ではないため、通常はリストではなくタプルです。
  • あなたのコメントにもかかわらず、あなたは新しいプロセスを生み出しません。loop/0への呼び出しは同じループに入ります。

Gen_serverinitはstart/0本体を保持します。API呼び出しはシーケンスを実行し、gen_serverを介して呼び出しをhandle_callsにプロキシします。関数呼び出しで新しいプロセスを生成するには、目的のhandle_callの本体にspawn関数を追加します。着信メッセージの処理にhandle_infoを使用しないでください。メッセージを送信する代わりに、gen_server APIを呼び出して、呼び出しをgen_server:callまたはcastに「変換」します。例えば

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()]).

私は上記でコンパイルしたことはありませんが、それはあなたにアイデアを与えるはずです。

于 2012-06-05T05:01:10.313 に答える