2014-07-21 57 views
1

据我所知,监督进程可以监督Erlang/OTP行为模型中的大量进程。监督Erlang/OTP监督行为中的普通进程

该过程可以是gen_server,gen_fsm,gen_event。我的问题是,一个普通的进程是否可以通过Erlang/OTP中的主管进程来监督?我的意思是一个不是gen_servergen_fsmgen_event的过程。

如果是这样,过程规范将如何看起来像?下面我试过,但不起作用:

Spec = {Id, {my_module, my_function, [Par1, ..., ParN]}, permanent, 5000, worker, [my_module]} 

我也试过这样:

Spec = {Id, {my_module, my_function, [Par1, ..., ParN]}, permanent, 5000, worker, []} 

但是,当我更换模块和功能与gen_server模块,并从里面的函数,这个效果很好。

我可以得出结论:监督员的子流程不能是一个普通流程吗?

错误,我得到的是:

错误是如下:应用程序:退出MYAPP :{bad_return, {{myapp_app,启动,[正常,[]}, { 'EXIT', { {badmatch, {错误, {关机, {failed_to_start_child,worker_1, {确定,状态}}}}}, [{myapp_app,开始,如图2所示, [{文件, “SRC/myapp_app.erl”} ,{line,27}]}, {application_master,start_it_old,4, [{file,“a pplication_master.erl“},{线,272}]}]}}}}

+0

你怎么知道它不起作用? – legoscia

+0

显然,我跑了它,并得到错误。 – user3389168

+0

你得到了什么错误? – legoscia

回答

3

最可能的原因,没有看到你的来源,这是失败的就是普通spawn调用返回只是一个PID,而不是到OTP start_link调用返回{ok, Pid},这是主管期望的。

对于一个普通的进程是否能够被监督...

简短的回答:是的,但你应该proc_lib启动它。

很长的回答:是的,但你应该用proc_lib启动它,其他一些事情不会受到伤害。基本上,如果您打算在OTP监督树中工作,您的过程应该符合OTP标准。请参阅OTP Design Principles以了解特殊/自定义流程,正如legoscia在您的问题的评论中所建议的。

如果您监督的流程不是以proc_lib开头的,那么您将失去主管给您的某些“保证”(缺少更好的术语)。例如,一个主管将不会在其进程列表中启动第二个进程,直到第一个进程完成其初始化函数(在gen_server/fsm/event的情况下)。通用spawn调用会丢失此“保证”。

+0

通用'spawn'调用丢失的保证,因为,不像proc_lib,没有“确认”步骤。另一方面,从'proc_lib'开始,迫使你使用'proc_lib:init_ack'来“确认”一个成功的启动,并且调用进程(在这种情况下为spawner; supervisor)在接收块中等待,直到它收到这个确认信息。 –