【问题标题】:simple_one_for_one start_child() returns already_startedsimple_one_for_one start_child() 返回 already_started
【发布时间】:2011-10-11 12:52:44
【问题描述】:

我有一个主管,应该启动 simple_one_for_one 工人。当我第一次致电start_child() 时,一切都很顺利。但是,当我第二次这样做时,我得到了{error,{already_started,<0.71.0>}}。为什么simple_one_for_one 主管会给我回复already_started?我错过了什么?

这里是代码:supervisorworker

【问题讨论】:

  • 你会对你的 gen 服务器处理消息感到非常困惑,因为你会产生一个子节点来向自己发送消息,然后在等待接收该消息时阻塞。
  • 为什么?我在单独的孩子中完成工作以防止 gen_server 崩溃。这是一件坏事吗?建议将不胜感激:-)
  • 如果gen_server崩溃了会不会是一场灾难?它将由主管重新启动。如果您担心错误,请使用try ... catch ... end 包装调用。虽然进程很便宜,但不必要地创建它们并没有任何好处,而且这里没有并发。
  • 你能把代码贴在这里吗?如果该链接断开,这个问题将毫无用处。

标签: erlang erlang-otp erlang-supervisor simple-one-for-one


【解决方案1】:

您正在为您的 gen_server 注册一个(本地)名称。一旦启动一个,就不能再启动另一个同名的了。

如果您改用 gen_server:start_link/3,从当前 gen_server:start_link/4 调用中删除第一个参数,您应该能够启动多个。

【讨论】:

    猜你喜欢
    • 2013-03-21
    • 1970-01-01
    • 2016-04-28
    • 2017-02-21
    • 2011-12-26
    • 1970-01-01
    • 2012-11-04
    • 2016-05-03
    • 2012-05-07
    相关资源
    最近更新 更多