erlang gen_server start

本文探讨了Erlang中gen_server的start_link函数,特别关注ServerName的local和global两种方式。在本地调用时,实验发现两者的主要区别在于定位进程PID的方式,global方式需要借助global:whereis_name来查找。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 这种注册方式 ,后来再看。。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值