Erlang 主管行为

Erlang 主管行为,erlang,otp,erlang-supervisor,Erlang,Otp,Erlang Supervisor,当执行主管时。。如果在“主管”模块中,我执行以下操作 初始化([])-> {好的, {{一对一,5,60}, [{reverse,{reverse,start_reverse,[]},永久性,残暴杀戮,worker,[]}} 反向功能是: 开始反转()-> Pid=spawn(?模块,反向,[]) 由于start_reverse功能在任何情况下都会正常退出,因此无法工作。但是,当我添加这样一行时: 开始反转()-> Pid=spawn(?模块,反向,[]), {好的,Pid} 即使函数正常退出,

当执行主管时。。如果在“主管”模块中,我执行以下操作

初始化([])->
{好的,
{{一对一,5,60},
[{reverse,{reverse,start_reverse,[]},永久性,残暴杀戮,worker,[]}}

反向功能是:

开始反转()->
Pid=spawn(?模块,反向,[])

由于start_reverse功能在任何情况下都会正常退出,因此无法工作。但是,当我添加这样一行时:

开始反转()->
Pid=spawn(?模块,反向,[]),
{好的,Pid}

即使函数正常退出,它也能工作。有人能解释一下原因吗?

很容易

问题是,
主管
需要一个特定的调用约定来支持进程的关闭和初始化。使用低级
spawn
的代码忽略该约定。你也应该

  • 使用gen\u something行为,
    gen\u服务器
    是最常见的
  • 使用
    proc_lib
  • 使用
    supervisor\u桥
否则,您的代码根本不会利用OTP。你想让它这么做。

很容易

问题是,
主管
需要一个特定的调用约定来支持进程的关闭和初始化。使用低级
spawn
的代码忽略该约定。你也应该

  • 使用gen\u something行为,
    gen\u服务器
    是最常见的
  • 使用
    proc_lib
  • 使用
    supervisor\u桥

否则,您的代码根本不会利用OTP。而你却希望如此。

事实上。。主管子进程实际上不需要成为
gen\u服务器
。主管特别提到:

start函数必须创建并链接到子进程,并应返回{ok,child}或{ok,child,Info},其中child是子进程的pid,Info是主管忽略的任意项


这就是为什么当您返回
{ok,Pid}
时它工作了..

实际上。。主管子进程实际上不需要成为
gen\u服务器
。主管特别提到:

start函数必须创建并链接到子进程,并应返回{ok,child}或{ok,child,Info},其中child是子进程的pid,Info是主管忽略的任意项


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

你能告诉我为什么我需要或应该需要OTP吗?@dkk:这对于另一个问题来说是一个很好的话题?搜索它,它可能已经被回答了…仅供参考,我已经创建了一个新问题:你能告诉我为什么我需要或应该需要OTP吗?@dkk:这将是另一个问题的一个好话题?搜索它,它可能已经被回答了…仅供参考,我创建了一个新问题: