1

我有许多可以独立作为单独应用程序的受监督组件。但我想将它们级联起来,以便一个组件中的工作人员中的调用或事件以倒置的树状结构开始下一个组件。

1) 我可以将这些组件中的每一个打包为单独的应用程序吗?2)如果是这样,我该如何编写调用代码来启动子应用程序?3)或者我是否需要完全做其他事情,如果需要,怎么办?

注意:我仍在努力掌握监督树。application:start(Mod) 之后的一连串事件仍然没有在我的脑海中燃烧。

非常感谢,

LRP

4

1 回答 1

1

监督树应用程序是复杂的 Erlang/OTP 概念。它们都记录在OTP 设计原则用户指南中,特别是:

监督树不是依赖树,不应该这样设计。相反,应根据所需的崩溃行为以及所需的启动顺序来定义监督树。提醒一下,每个运行时间足够长的进程都必须在监督树中。

应用程序是可以启动和停止的可重用组件。应用程序可以依赖于其他应用程序。但是,应用程序应在引导时启动,而不是在事件发生时启动。

当给定事件发生时,可以启动进程。如果此类过程应受到监督,只需supervisor:start_child/2在事件发生时调用其主管即可。这将启动该过程并将其插入到监督树中。您通常会使用一个简单的一对一主管,该主管最初没有孩子。

最后:

  1. 您可以将组件打包为单独的应用程序。在这种情况下,您将在每个应用程序的app(4)文件中声明应用程序的依赖关系。然后只能以正确的顺序启动应用程序,或者使用引导脚本或使用application:start/1.

  2. 您可以将所有组件打包在一个应用程序中,并让工作进程使用supervisor:start_child/2.

  3. 您可以将组件打包为单独的应用程序,并让一个应用程序中的工作进程在另一个应用程序中启动进程。在这种情况下,最好在目标应用程序中定义一个模块来调用supervisor:start_child/2自身,因为应用程序应该有干净的 API。

当您有工作进程(父进程)启动其他工作进程(子进程)时,您可能会链接这些进程。链接是通过link/1. 链接是对称的,通常是从父级建立的,因为父级知道子级的 pid。如果父进程异常退出,子进程将被终止,并且反过来。

链接是处理崩溃的最常用方法,例如,如果父级不再存在,则应终止子级。链接实际上是 OTP 监管的基础。在工作进程之间添加链接表明设计监督树实际上很困难。实际上,使用链接,如果一个进程崩溃,您将终止两个进程,但是,您可能不希望主管重新启动子进程,因为主管重新启动的子进程将不知道(或链接)到主管重新启动的父进程。

如果当孩子正常退出时,父母就终止了,那么这是一个完全不同的设计。您可以让孩子向父母发送消息(例如返回结果)或父母监控孩子。

最后,父进程可以终止子进程。如果孩子有人看管,请使用supervisor:terminate_child/2. 否则,您可以简单地向子进程发送退出信号。在任何一种情况下,您都需要取消链接子进程以避免父进程退出。

链接监视器都记录在Erlang 参考手册用户指南中。除了监视器,您可能会想要设置出口,指南中对此进行了解释。但是,实现此功能的手册页(process_flag/2)具体内容如下:

应用程序进程通常不应捕获出口。

这是典型的 OTP 设计智慧,在文档中到处传播。请改用监视器或简单消息。

于 2013-08-10T22:12:21.307 回答