2012-06-05 32 views
1

我有簡單的erlang模塊,我想根據OTP原則重寫它。但我無法確定我應該使用什麼選擇模板。這種模塊應該使用哪些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. 

回答

3

gen_server就可以了。

兩件事情:

  • 這是一個不好的做法,因爲他們不是動態的
  • 要發送消息給自己
  • 消息通常元組沒有列出,儘管你的意見,你不產卵新處理。 呼叫循環/ 0進入相同的循環。

Gen_server init將保存您的開始/ 0正文。 API調用序列並通過gen_server將您的調用代理到handle_calls。爲了在函數調用中產生新的進程,將spawn函數添加到所需的handle_call的主體中。不要使用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()]). 

我從來沒有編譯過,但它應該給你的想法。

+0

謝謝,但接收部分應該在哪裏?或者我可以通過產生'some_fun'過程中的'?MODULE'過程來接收消息? – rdo

+1

接收體在'gen_server'模塊中隱藏。消息接收通過回調函數 –

+0

發生。語法很花哨,但它也很難追蹤。在真實系統中,並行化隱藏在衆所周知的行爲(如gen_srv)中,並纏繞函數調用。 – user425720

相關問題