我一直在使用Erlang,但我可能总是会被它欺骗。supervisor可以在sup文件中使用start_link启动worker。进程也可以在其他任何地方使用{ok,_} = file:start_link()启动。我应该选择哪种方式以及何时/为什么选择其中一种?
sh7euo9m1#
Supervisor负责启动、停止和监视其子进程。Supervisor的基本思想是通过在必要时重新启动子进程来保持其子进程的活动。要启动和监视的子进程由子规范列表指定。https://www.erlang.org/doc/design_principles/sup_princ.html#supervision-principles仅仅因为一个进程启动了第二个进程并不意味着第一个进程是一个监督进程。如果第二个进程死亡,第一个进程不会自动重新启动第二个进程。如果两个进程链接,其中一个死亡,那么另一个也会死亡。您不希望监督进程在其子进程死亡时死亡。
brvekthn2#
在启动进程的两种方式中-使用监督程序或调用函数直接启动进程-在大多数情况下,首选的方式是使用监督程序。监督程序提供更多的功能和对已启动进程的更多控制。如自动重新启动意外死亡的进程的功能。如in the documentation所述,监督程序是高度可配置的。另一方面,如果您只是直接从代码启动流程,那么您要么无法控制或查看已启动的流程,要么您需要手动实现至少部分Supervisor功能。话虽如此,每个规则都有例外,在某些情况下,从代码显式启动流程是更好的选择。但是使用监督程序是合理的默认设置。附加说明:与另一个答案所建议的相反,使用start_link和其他链接函数与监督程序是完全安全的。实际上,这是必需的,因为文档指出“start函数必须创建并链接到子进程”。监督程序使用链接来跟踪它们启动的进程。
2条答案
按热度按时间sh7euo9m1#
Supervisor负责启动、停止和监视其子进程。Supervisor的基本思想是通过在必要时重新启动子进程来保持其子进程的活动。
要启动和监视的子进程由子规范列表指定。https://www.erlang.org/doc/design_principles/sup_princ.html#supervision-principles
仅仅因为一个进程启动了第二个进程并不意味着第一个进程是一个监督进程。如果第二个进程死亡,第一个进程不会自动重新启动第二个进程。如果两个进程链接,其中一个死亡,那么另一个也会死亡。您不希望监督进程在其子进程死亡时死亡。
brvekthn2#
在启动进程的两种方式中-使用监督程序或调用函数直接启动进程-在大多数情况下,首选的方式是使用监督程序。监督程序提供更多的功能和对已启动进程的更多控制。如自动重新启动意外死亡的进程的功能。如in the documentation所述,监督程序是高度可配置的。
另一方面,如果您只是直接从代码启动流程,那么您要么无法控制或查看已启动的流程,要么您需要手动实现至少部分Supervisor功能。
话虽如此,每个规则都有例外,在某些情况下,从代码显式启动流程是更好的选择。但是使用监督程序是合理的默认设置。
附加说明:与另一个答案所建议的相反,使用start_link和其他链接函数与监督程序是完全安全的。实际上,这是必需的,因为文档指出“start函数必须创建并链接到子进程”。监督程序使用链接来跟踪它们启动的进程。