二郎关于?SERVER和?的区别问题模块宏

问题描述

在所有 gen_server 实现的示例中,我已经看到?SERVER 被分配给?MODULE 在这里俯视:

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

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

解决方法

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

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