gen_server start_link
start_link(Module, Args, Options) -> Result
start_link(ServerName, Module, Args, Options) -> Result
Types:
ServerName = {local,Name} | {global,GlobalName} | {via,Module,ViaName}
Name = atom()
GlobalName = ViaName = term()
Module = atom()
Args = term()
Options = [Option]
Option = {debug,Dbgs} | {timeout,Time} | {spawn_opt,SOpts}
Dbgs = [Dbg]
Dbg = trace | log | statistics | {log_to_file,FileName} | {install,{Func,FuncState}}
SOpts = [term()]
Result = {ok,Pid} | ignore | {error,Error}
Pid = pid()
Error = {already_started,Pid} | term()
可以看到 ServerName 有几种方式
local, global,via
比较好奇 local与global在本地调用会有什么差别
做了个小实验,
gen_server:start_link {local, Name}
whereis(Name) Pid
global:whereis_name(Name) undefined
gen_server:start_link {global, Name}
whereis(Name) undefined
global:whereis_name(Name) Pid
可以看到 通过global 注册的gen_server 不能通过whereis 进行查找了
必须通过 global:whereis_name 来查找pid
原因在于
If ServerName={local,Name} the gen_server is registered locally as Name using register/2.
If ServerName={global,GlobalName} the gen_server is registered globally as GlobalName using global:register_name/2.
If no name is provided, the gen_server is not registered.
至于via 这种注册方式 ,后来再看。。