【问题标题】:Erlang. Question about the difference of ?SERVER and ? MODULE macros二郎。关于 ?SERVER 和 ? 的区别的问题模块宏
【发布时间】:2020-12-15 10:49:00
【问题描述】:

在我看到的所有 gen_server 实现示例中,?SERVER 被分配给 ?MODULE。 往下看:

-define(SERVER, ?MODULE).
...    
gen_server:start_link({local, ?SERVER}, ?MODULE, [], [])

我的想法是运行许多具有不同名称但在一个模块中实现的服务器进程。 但是,当我在实验中尝试使用与模块名称不同的名称运行服务器时,总是会出错。 可以,请有人解释一下这个微妙之处。

【问题讨论】:

  • 你得到什么错误?
  • 这很奇怪,但现在我没有错误。您可能会在下面看到结果>

标签: erlang erlang-otp


【解决方案1】:

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

引入与 MODULE 具有相同值的单独 SERVER 宏的原因是为了使事情更明确。在 start_link 调用中,这两个宏可能具有相同的值,但它们的用途不同,因此使用两个而不是一个更清楚。

【讨论】:

  • 代码为: start_link() -> </br> gen_server:start_link({local, gs_name}, ?MODULE, [], []). </br> 我得到了: 21> c(gs_sample, [debug]). </br> {ok,gs_sample} </br> 22> gs_sample:start_link(). </br> {ok,<0.115.0>} </br> 23> gen_server:cast(gs_sample, "msg"). </br> ok </br> "msg" </br> 24> gen_server:cast(gs_name, "msg"). </br> "msg" </br> ok </br> 顺便说一句,如何从一个模块启动多个命名服务器(原因与 OTP)?
  • 25> whereis(gs_name)。 26> 其中是(gs_sample)。
  • @UDAV21 是的,如果您不直接使用您在问题中发布的代码,但是修改它,您可能会启动在同一模块中实现的多个服务器。
  • 好的。非常感谢大家。
  • 顺便说一句,谁能给我看一下 ?SERVER 不等于 ?MODULE 的例子。
猜你喜欢
  • 2016-01-24
  • 2023-04-09
  • 2017-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-26
  • 1970-01-01
相关资源
最近更新 更多