Erlang 二郎。关于?服务器和?的区别的问题?模块宏

Erlang 二郎。关于?服务器和?的区别的问题?模块宏,erlang,otp,Erlang,Otp,在gen_服务器实现的所有示例中,我看到?服务器被分配到?模块。 往下看: -define(SERVER, ?MODULE). ... gen_server:start_link({local, ?SERVER}, ?MODULE, [], []) 我得出的结论是,运行许多具有不同名称但在一个模块中实现的服务器进程。 但是,在我的实验中,当我尝试使用和模块名不同的名称运行服务器时,我总是会出错。 请有人给我解释一下这个微妙之处。您显示的代码没有也不能实现多个具有不同名称的服务器,因为服

在gen_服务器实现的所有示例中,我看到?服务器被分配到?模块。 往下看:

-define(SERVER, ?MODULE).
...    
gen_server:start_link({local, ?SERVER}, ?MODULE, [], [])
我得出的结论是,运行许多具有不同名称但在一个模块中实现的服务器进程。 但是,在我的实验中,当我尝试使用和模块名不同的名称运行服务器时,我总是会出错。
请有人给我解释一下这个微妙之处。

您显示的代码没有也不能实现多个具有不同名称的服务器,因为服务器名称定义为与模块名称相同。因此,如果您尝试使用此代码在一个模块中实现多个服务器,您的尝试将失败


引入与模块具有相同值的单独服务器宏的原因是为了使事情更加明确。在start\u link调用中,两个宏的值可能相同,但用途不同,因此使用两个宏比使用一个宏更清楚。

会出现什么错误?很奇怪,但现在我没有错误。您可以看到下面>的结果,代码为:
start\u link()->
gen\u server:start\u link({local,gs\u name},MODULE,[],[])

我得到了:

21>c(gs_示例,[debug])
{ok,gs_sample}
22>gs_sample:start_link()
{ok,}
23>gen_服务器:cast(gs_示例,“msg”)
确定
“msg”
24>发电机组服务器:cast(发电机组名称,“msg”)
“msg”
好的


顺便问一下,如何从一个模块启动多个命名服务器(当然是OTP)?25>在哪里(gs\U名称)。26>在哪里(gs_样本)@UDAV21是如果您不直接使用问题中发布的代码,但对其进行修改,则可以启动在同一模块中实现的多个服务器。确定。非常感谢大家。顺便问一下,有人能给我举个例子吗?服务器不等于?模块。