Erlang监控与应用

Erlang监控与应用,erlang,erlang-supervisor,Erlang,Erlang Supervisor,我有许多受监督的组件,它们可以作为单独的应用程序独立运行。但我想将它们级联,这样一个组件中的工作进程中的调用或事件就会以倒立的树状结构启动下一个组件 1) 我可以将这些组件打包为单独的应用程序吗? 2) 如果是这样,如何编写调用代码来启动子应用程序? 3) 或者我需要做一些其他的事情,如果需要,是什么 注:我仍在努力掌握监督树。应用程序:start(Mod)之后发生的一系列事件仍然没有在我的头脑中很好地燃烧 非常感谢, LRP和应用程序是复杂的Erlang/OTP概念。它们都记录在以下文件中,特

我有许多受监督的组件,它们可以作为单独的应用程序独立运行。但我想将它们级联,这样一个组件中的工作进程中的调用或事件就会以倒立的树状结构启动下一个组件

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

注:我仍在努力掌握监督树。应用程序:start(Mod)之后发生的一系列事件仍然没有在我的头脑中很好地燃烧

非常感谢,


LRP和应用程序是复杂的Erlang/OTP概念。它们都记录在以下文件中,特别是:

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

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

当给定事件发生时,可以启动进程。如果需要监督这些过程,只需在事件发生时呼叫其主管
supervisor:start_child/2
。这将启动流程,并将其插入到监督树中。通常,您将使用一个最初没有子级的

因此:

  • 您可以将组件打包为单独的应用程序。在本例中,您将在每个应用程序的文件中声明应用程序的依赖关系。然后,应用程序只能以正确的顺序启动,可以使用启动脚本,也可以使用
    application:start/1
    交互启动

  • 您可以将所有组件打包到单个应用程序中,并让工作进程启动其他工作进程

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

  • 当工作进程(父进程)启动其他工作进程(子进程)时,您可能会链接这些进程。连接是通过以下方式实现的。链接是对称的,通常是从父节点建立的,因为父节点知道子节点的pid。如果父进程异常退出,则子进程将被终止,反之亦然

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

    如果家长在孩子正常退出时终止,则这是一种完全不同的设计。您可以让孩子向家长发送消息(例如返回结果),也可以让家长监控孩子

    最后,父进程可以终止子进程。如果孩子在监督下,使用。否则,您可以简单地向子进程发送退出信号。在这两种情况下,您都需要取消子进程的链接,以避免父进程退出

    和都记录在中。您可能会被诱捕出口而不是监视器,如中所述。但是,实现此()的函数的手册页具体如下:

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


    这是典型的OTP设计智慧,在文档中随处可见。改用监视器或简单消息。

    监控树和应用程序是复杂的Erlang/OTP概念。它们都记录在以下文件中,特别是:

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

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

    当给定事件发生时,可以启动进程。如果需要监督这些过程,只需在事件发生时呼叫其主管
    supervisor:start_child/2
    。这将启动流程,并将其插入到监督树中。通常,您将使用一个最初没有子级的

    因此:

  • 您可以将组件打包为单独的应用程序。在本例中,您将在每个应用程序的文件中声明应用程序的依赖关系。然后,应用程序只能以正确的顺序启动,可以使用启动脚本,也可以使用
    application:start/1
    交互启动

  • 您可以将所有组件打包到单个应用程序中,并让工作进程启动其他工作进程

  • 你可以打包