使用相同的模块/不同的参数监督多个gen_servers

时间:2010-04-15 16:04:45

标签: erlang otp

我有一个OTP应用程序,包括一个监督少量gen_servers的主管。典型的子规范如下:

{my_server,
  {my_server, start_link, [123]},
  permanent, 
  5000, 
  worker,
  [my_server]}

到目前为止没有问题。

我现在想要使用与上面相同的模块Module / Fn向主管结构添加额外的gen_server,但是不同的参数,例如

{my_server_2,
  {my_server, start_link, [123]},
  permanent, 
  5000, 
  worker,
  [my_server_2]}

我认为这会奏效,但不会:

=SUPERVISOR REPORT==== 15-Apr-2010::16:50:13 ===
     Supervisor: {local,my_sup}
     Context:    start_error
     Reason:     {already_started,<0.179.0>}
     Offender:   [{pid,undefined},
                  {name,my_server_2},
                  {mfa,{my_server,start_link,[]}},
                  {restart_type,permanent},
                  {shutdown,5000},
                  {child_type,worker}]

每个子规范的第二个元素中的模块参数是否需要不同?

谢谢,

贾斯汀

1 个答案:

答案 0 :(得分:7)

我的猜测是my_server使用gen_server:start_link / 4来注册它的名字,所以当第二个尝试启动时它不能,因为名字已被采用。 gen_servers必须在没有名称(gen_server:start_link / 3)或不同名称的情况下启动。

改变子规范的最后一个元素似乎很奇怪,它标识了工作者使用的模块列表。这真的是你想要的吗?