主管行为

时间:2011-05-03 10:36:46

标签: erlang otp supervisor

实施主管时..如果在主管模块中,我做了类似

的事情
  

init([_]) - >
  【OK,
  {{one_for_one,5,60},
  [{reverese,{reverse,start_reverse,[]},permanent,brutal_kill,worker,[]}]}}。

,反向功能是:

  

start_reverse() - >
    PID =产卵(?MODULE,逆转,[])。

由于start_reverse函数在每种情况下都正常退出,因此无效。但是,当我添加这样一行时:

  

start_reverse() - >
    PID =产卵(?MODULE,逆转,[]),
    【OK,PID}。

即使功能也正常退出,它也能正常工作。有人可以解释原因吗?

2 个答案:

答案 0 :(得分:5)

轻松,

问题是supervisor需要一个特定的调用约定来支持进程的关闭和初始化。具有低级spawn的代码会忽略该约定。你应该

  • 使用gen_something行为,gen_server是最常见的。
  • 使用proc_lib
  • 生成流程
  • 使用supervisor_bridge

否则,您的代码根本不会利用OTP。你想要它。

答案 1 :(得分:1)

实际上......主管子进程并非真正需要gen_server。主管documentation特别提及

  

start函数必须创建并链接到子进程,并且应该返回{ok,Child}或{ok,Child,Info},其中Child是子进程的pid,Info是任意一个被忽略的术语。主管。

这就是为什么当你返回{ok, Pid}时它工作的原因..