1

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

init([_]) ->
{ok,
{{one_for_one, 5, 60},
[{reverese, {reverse, start_reverse, []}, Permanent, Brut_kill, worker,[]}]}}。

反向函数是:

start_reverse() ->
Pid=spawn(?MODULE,reverse,[])。

它不会起作用,因为 start_reverse 函数在每种情况下都会正常退出。但是,当我添加这样的一行时:

start_reverse() ->
Pid=spawn(?MODULE,reverse,[]),
{ok,Pid}。

即使函数正常退出,它也可以工作。有人可以解释为什么吗?

4

2 回答 2

5

容易地,

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

  • 使用 gen_something 行为gen_server是最常见的。
  • 使用生成进程proc_lib
  • 用一个supervisor_bridge

否则,您的代码将根本无法利用 OTP。你想要它。

于 2011-05-03T10:45:14.593 回答
1

实际上.. 主管子进程实际上并不需要成为gen_server. 主管文件特别提到

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

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

于 2011-05-03T16:16:23.183 回答