在Erlang/OTP监督员行为中监督普通流程

在Erlang/OTP监督员行为中监督普通流程,erlang,Erlang,据我所知,一个主管进程可以在Erlang/OTP行为模型中监督许多进程 该进程可以是genu服务器、genu fsm、和genu事件。我的问题是,在Erlang/OTP中,普通流程是否可以由主管流程进行监督?所谓普通进程,我指的是不是gen\u服务器,gen\u fsm,或gen\u事件的进程 如果是这样,工艺规范会是什么样子?我尝试了以下操作,但不起作用: Spec = {Id, {my_module, my_function, [Par1, ..., ParN]}, permanent, 5

据我所知,一个主管进程可以在Erlang/OTP行为模型中监督许多进程

该进程可以是
genu服务器
genu fsm、
genu事件
。我的问题是,在Erlang/OTP中,普通流程是否可以由主管流程进行监督?所谓普通进程,我指的是不是
gen\u服务器
gen\u fsm
,或
gen\u事件
的进程

如果是这样,工艺规范会是什么样子?我尝试了以下操作,但不起作用:

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_返回, {{myapp_app,start,[normal,[]]}, {'EXIT', {{糟糕的比赛, {错误, {关闭, {启动子项、工作项1失败, {好的,状态}, [{myapp\u app,开始,2, [{file,“src/myapp_app.erl”},{line,27}]}, {应用程序主控程序,启动旧的,4,
[{file,“application_master.erl”},{line,272}]}}}

在没有看到源代码的情况下,最有可能失败的原因是普通的
spawn
调用只返回一个pid,而不是返回
{ok,pid}
的OTP
start_link
调用,这是主管所期望的

至于是否可以监督一个普通的过程

简短回答:是的,但应该从proc_lib开始

长回答:是的,但是你应该从proc_lib开始,其他一些事情也不会有什么坏处。基本上,如果您想让流程在OTP监控树中工作,那么您的流程应该符合OTP。请参考Legocia在对您的问题的评论中建议的特殊/定制流程


如果您监督的流程不是以proc_lib启动的,那么您将失去主管给您的某些“保证”(因为缺少更好的术语)。例如,在第一个进程完成init功能之前(在gen_server/fsm/event的情况下),主管不会启动其进程列表中的第二个进程。这个“保证”在泛型
spawn
调用中丢失了。

你怎么知道它不起作用?显然,我运行了它,并得到了错误。你得到了什么错误?我的问题是:一个普通的进程能被一个主管进程监督吗?不使用标准行为而适合被监督树的进程称为“特殊进程”,原则上应该遵循所描述的指导原则——但实际上,你通常可以忽略这些指导原则。这就是我询问错误消息的原因:在你的问题中没有任何关于出错原因的线索。泛型
spawn
调用失去了保证,因为与proc_lib不同,没有“确认”步骤。另一方面,从
proc_lib
开始,强制您使用
proc_lib:init_ack
来“确认”成功的启动,并且调用进程(在这种情况下是生成者;主管)在接收块中等待,直到它收到此确认消息。