我有一个简单的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.
gen_server就可以了。
几件事:
- 给自己发消息是一种不好的做法
- 消息通常是元组而不是列表,因为它们不是动态的
- 尽管您发表了评论,但您不会生成新流程。对循环/0 的调用进入相同的循环。
Gen_server init 将保留您的 start/0 主体。API 调用通过gen_server对handle_calls调用进行排序和代理。要在函数调用时生成新进程,请将生成函数添加到所需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()]).
我从来没有在上面编译过,但它应该给你一个想法。