调用gen_server启动的方法
gen_server :start_link ( { local, ?MODULE } , ?MODULE , [ ] , [ ] ) .
参数分别是Name,Mod,Arg,Options
Options里可以设置timeout
gen.erl里的简单小函数取得timeout
timeout(Options) ->
case opt(timeout, Options) of
{ok, Time} ->
Time;
_ ->
infinity
end.
spawn_opts(Options) ->
case opt(spawn_opt, Options) of
{ok, Opts} ->
Opts;
_ ->
[]
end.
opt(Op, [{Op, Value}|_]) ->
{ok, Value};
opt(Op, [_|Options]) ->
opt(Op, Options);
opt(_, []) ->
false.
gen_server启动流程大体如下:
在我们的程序里启动一般调用如下:
gen_server :start_link ( { local, ?MODULE } , ?MODULE , [ ] , [ ] ) .
gen_server.erl 里
start_link(Name, Mod, Args, Options) ->
gen:start(?MODULE, link, Name, Mod, Args, Options).
gen.erl里基本是这样
do_spawn(GenMod, link, Mod, Args, Options) ->
Time = timeout(Options),
proc_lib:start_link(?MODULE, init_it,
[GenMod, self(), self(), Mod, Args, Options],
Time,...
proc_lib是一个关于进程的工具类,提供了同步启动进程的机制
start_link(M,F,A,Timeout,SpawnOpts) when is_atom(M), is_atom(F), is_list(A) ->
Pid = proc_lib:spawn_opt(M, F, A, ensure_link(SpawnOpts)),
sync_wait(Pid, Timeout).
sync_wait(Pid, Timeout) ->
receive
{ack, Pid, Return} ->
Return;
{'EXIT', Pid, Reason} ->
{error, Reason}
after Timeout ->
unlink(Pid),
exit(Pid, kill),
flush(Pid),
{error, timeout}
end.
spawn_opt系列大体就是erlang:spawn系里的一个,是异步的,先调用了本模块的init_p,存放些上下文信息到进程字典,最终会回调gen_server,一会再说
同步的关键在sync_wait这句,一看就懂了
上面的spawn经过fun的传来传去最终回到了gen_server.erl
init_it(Starter, self, Name, Mod, Args, Options) ->
init_it(Starter, self(), Name, Mod, Args, Options);
init_it(Starter, Parent, Name0, Mod, Args, Options) ->
Name = name(Name0),
Debug = debug_options(Name, Options),
case catch Mod:init(Args) of
{ok, State} ->
proc_lib:init_ack(Starter, {ok, self()}),
loop(Parent, Name, State, Mod, infinity, Debug);
{ok, State, Timeout} ->
proc_lib:init_ack(Starter, {ok, self()}),
loop(Parent, Name, State, Mod, Timeout, Debug);
{stop, Reason} ->
%% For consistency, we must make sure that the
%% registered name (if any) is unregistered before
%% the parent process is notified about the failure.
%% (Otherwise, the parent process could get
%% an 'already_started' error if it immediately
%% tried starting the process again.)
unregister_name(Name0),
proc_lib:init_ack(Starter, {error, Reason}),
exit(Reason);
ignore ->
unregister_name(Name0),
proc_lib:init_ack(Starter, ignore),
exit(normal);
{'EXIT', Reason} ->
unregister_name(Name0),
proc_lib:init_ack(Starter, {error, Reason}),
exit(Reason);
Else ->
Error = {bad_return_value, Else},
proc_lib:init_ack(Starter, {error, Error}),
exit(Error)
end.
看见这句了吧
catch Mod:init(Args)
分享到:
相关推荐
NULL 博文链接:https://lzy.iteye.com/blog/324962
gen_lex_hash for pc,mysql交叉编译需要用到的文件,5.1.51 and 5.1.63两个版本,5.1.67版本始终编译不出来。有需要的下载。
通用 TCP 服务器 通用 TCP 服务器( gen_tcp_server ) 是一种 Erlang 行为,提供快速简便的方法将 TCP 服务器功能添加到您的应用程序。 它被实现为管理 TCP 连接的主管,因为它是孩子。如何使用它? 运行make来构建。...
Gen_Signature_Android2.apk、获取签名工具。
Gen_Signature_Android.apk
关于在 Erlang 风格的 gen_server 上进行 Ocaml/Async 尝试。
srio_response_gen_srio_gen2_0_srio_gen_srio_reponse_SRIO_gen2_SRIO_源码.zip
包名签名查看,输入包名则可查看签名值,用于微信第三方分享 登录等设置填写,安装则可以使用,没需要任何设置,可以在安卓模拟器上使用
Model_gen_islanding_system_源码.zip
gen_funciones_arduino_code_源码
华硕Z87-C主板升级BIOS的工具,BIOS_updater_for_4th_Gen_Intel_Core_CPU.zip
个人学习Erlang的时候自己写的一个基于gen_tcp的聊天室,功能有注册,登陆,获得登陆时间,聊天次数,上次登陆时间等等,资源里有完整代码,注释也很详细.
gen_lyricist.dll 万能播放器仿千千静听
Virtual_gen_SIMULINK_VSG_matlabsimulink_源码.zip
signal_gen_无源定位_PassiveRadar_无源定位雷达_雷达定位_雷达_源码.zip
GLONASS_ideal_sig_gen_l1导航_glonass_导航信号_信号仿真_IDEAL_源码.zip
1、将2560及ramps1.4集合在一块板子上,解决了Ramps1.4组合接口繁琐,易出故障的问题。 2、可更换电机驱动,支持4988驱动和8825驱动。 3、电路板采用高质量的4层板,并专门作了散热优化处理;...