4

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

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

到目前为止没有问题。

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

{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}]

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

谢谢,

贾斯汀

4

1 回答 1

8

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

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

于 2010-04-15T16:51:45.357 回答