Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
了解Erlang/Elixir中的主管职责_Erlang_Elixir_Erlang Stdlib - Fatal编程技术网

了解Erlang/Elixir中的主管职责

了解Erlang/Elixir中的主管职责,erlang,elixir,erlang-stdlib,Erlang,Elixir,Erlang Stdlib,我写了一个新的图书馆叫 这是一个主管图书馆。 它的一个特性是给控制器一个arity 2的乐趣,控制器将为进程的每次崩溃调用函数,第一个参数是崩溃原因,第二个参数是崩溃计数,例如: -module(director_test). -behaviour(director). -export([start_link/0, init/1]). start_link() -> director:start_link(?MODULE, []). init([]) -> Chi

我写了一个新的图书馆叫 这是一个主管图书馆。
它的一个特性是给控制器一个arity 2的乐趣,控制器将为进程的每次崩溃调用函数,第一个参数是崩溃原因,第二个参数是崩溃计数,例如:

-module(director_test).
-behaviour(director).
-export([start_link/0, init/1]).

start_link() ->
    director:start_link(?MODULE, []).

init([]) ->
    ChildSpec = #{id => foo,
                  start => {m, f, args},
                  plan => [fun my_plan/2],
                  count => infinity},
    {ok, [ChildSpec]}.

my_plan(normal, Count) when Count rem 10 == 0 ->
    %% If process crashed with reason normal after every 10 times
    %%, director will restart it after spending 3000 milliseconds.
    {restart, 3000};
my_plan(normal, _Count) ->
    %% If process crashed with reason normal director will restart its
    restart;
my_plan(killed, _Count) ->
    %% If process was killed, Director will delete it from its children
    delete;
my_plan(Reason, Count) ->
    %% For other reasons, director will crash with reason {foo_crashed, Reason}
    {stop, {foo_crashed, Reason}}.
我宣布我的图书馆处于闲置状态,他们想用这种方式来撰写新的主管! 有人说“我倾向于不让主管退让”。
最后,他们没有告诉我干净的信息,我想我需要更多地了解主管及其职责等。 我认为主管是一个应该了解何时重新启动哪个子级、何时删除哪个子级以及何时不重新启动哪个子级的过程我说得对吗?


你能告诉我一些我在Director中没有的OTP/主管的优点吗?()

请不要把这件事当回事。你已经要求得到反馈,我正试图给你

快速查看文档和代码后,我认为您的库的主要问题是:

  • 您在通常不需要的领域引入了一些复杂性。在绝大多数Erlang程序中,您不想分析进程崩溃的原因。分析它容易出错。所以“正常”的解决方案就是重启流程。如果在这一点上引入任何逻辑,也可能引入一些错误。这样一个计划更难推理,其优点至少是有争议的

  • 您假设退出原因就是流程退出的原因。这不一定是真的。原因可能是由其链接进程传播的。如果您真的想对所有可能的退出原因做出反应,那么您必须对所有流程退出原因、所有it的子级退出原因、所有it的子级退出原因等进行传递性关闭,并且您必须在任何组件发生变化时进行更改,这是非常糟糕的态度,非常容易出错。引入的复杂性(见1)爆发得非常严重

  • 您在董事计划中引入了一些“内省”逻辑,这些逻辑应该在理想的情况下保持内部逻辑,即,在其模块之外使用的流程的内部工作方面有一些知识。这在某种程度上破坏了封装。“普通”主管只知道如何启动流程,不需要更多关于流程内部的信息

  • 最后但并非最不重要的一点:您可能正在解决一个不存在的问题。您不应该开发一个全新的解决方案,而应该清楚地识别现有解决方案的问题,并尝试以非常直接和最少的方式解决它们


  • 你把监督和管理的思想混为一谈

    监督已经是OTP的一部分。其基本思想是:

    • 任何进程都不可能成为孤立进程
    • 崩溃将被重新启动或中止,这是在编写内部逻辑之前做出的体系结构决策
    • 可以在外部记录崩溃(由进程处理,而不是任何失败的进程)
    • 错误处理代码、崩溃取证等都不会作为监督的一部分出现。曾经(复杂的逻辑导致复杂的怪异,监管需要简单、稳健和可靠。)
    管理是系统中可能存在或不存在的东西,因此由您决定。它的想法是,您将有一个单一的(通常命名的)流程来指导您的(受监督的)员工正在执行的总体高级任务。拥有一个管理器流程可以为正在完成的总体工作提供一个单一的控制点——这也意味着它是一个单一的位置,您可以从中判断启动、停止、暂停自身的总体工作,等等。在这里,您可以根据一些崩溃情况添加关于选择性重新启动的附加逻辑

    将“监督”视为一种低层次、系统框架型理念。这在所有程序中都是一样的,就像打开文件或处理网络套接字一样。将管理视为您的程序完成其工作所需解决的实际问题的一部分

    管理可能复杂,也可能不复杂。监督必须始终统一和简单。让主管承担太多的责任会使他们难以理解和调试,并且经常会导致业务问题——超负荷的主管可能是系统中的一个主要问题。不要让你的上司承担高级别的管理任务


    不久前,我在Erlang中写了一篇关于“服务->工作者模式”的文章。希望它能提供更多信息,而不是混淆:

    通常,当新的东西出现时,你有责任展示你的库中有什么好东西,让我们依赖它,而不是从一开始就使用OTP核心中简单的旧好范例?我就是这么做的(我想),但问题是,他们导致我认为这是正确和正确的方法吗?许多thakns为你们花费的时间只是为了给出反馈。