您的位置:首页 > 其它

Erlang gen_server:start_link/3 和gen_server:start_link/4

2012-02-24 11:32 309 查看
两个方法都可以用来启动一个gen_server服务器进程,具体的参数如下:

gen_server:start_link(Module,Args,Option);

gen_server:start_link(ServerName,Module,Args,Option);

第二个方法只比第一个多了个ServerName,在gen_server的源码中区别如下:

start_link(Mod, Args, Options) ->
gen:start(?MODULE, link, Mod, Args, Options).

start_link(Name, Mod, Args, Options) ->
gen:start(?MODULE, link, Name, Mod, Args, Options).


再具体看gen的源码:

-spec start(module(), linkage(), emgr_name(), module(), term(), options()) ->
start_ret().

start(GenMod, LinkP, Name, Mod, Args, Options) ->
case where(Name) of
undefined ->
do_spawn(GenMod, LinkP, Name, Mod, Args, Options);
Pid ->
{error, {already_started, Pid}}
end.

-spec start(module(), linkage(), module(), term(), options()) -> start_ret().

start(GenMod, LinkP, Mod, Args, Options) ->
do_spawn(GenMod, LinkP, Mod, Args, Options).

可以看出如果有ServerName参数就会先查找一遍是否有同名的进程存在,有就会产生{error,{already_started,Pid}} 的提示。

所在在开发并发的gen_server程序的时候要注意调用哪个方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: