gpt4 book ai didi

erlang - 如何检查进程是否被主管重新启动?

转载 作者:行者123 更新时间:2023-12-04 18:09:05 24 4
gpt4 key购买 nike

更准确地说:

我有一个动态数量的 child 的主管。我希望它在第一次添加和启动给定子项时使用不同的 init 函数,而不是所有重新启动后将发生的情况。或者,如果进程有可能发现它已重新启动,我可以使用相同的函数。

最佳答案

从技术上讲,有副作用这可用于确定进程是否被其主管重新启动,或者它是否是第一次启动。例如,您可以检查进程的 pid 并将其与主管的 pid 进行比较。然而,这很丑陋,容易出错,而且 与 OTP 原则不一致 .事实上,监管者本身、应用程序或节点本身可能已经重新启动。试图找出答案是徒劳的。

相反,遵循 OTP 原则,您必须确保 无论是首次启动还是重新启动,受监督的进程都执行相同的任务 .这可以通过处理进程之间依赖关系的适当监督树来实现。

希望查明进程是启动还是重启的典型原因是因为当它们第一次启动时,它们必须做一些不需要在重启时重做的事情。最终,您需要确保在开始时需要完成的操作在终止时撤消 ,因此您的流程在所有情况下都可以在开始时做同样的事情。

例如,要做的可能是启动另一个进程(我们称之为 B),然后在启动时将子进程和进程 B 链接起来,然后子进程终止,B 也将终止(并且相互)。您必须将 B 进程的主管配置为不重新启动其子进程(即使它们成为临时的)。

(根据下面的第一条评论更新)

加工厂只会进一步插入问题 但并没有完全解决它。假设您有一个工厂负责创建子代。这个过程可以保存 child 的状态并在重新启动时恢复它们。要实现这一目标,您将:

  • 确保主管不会重启 child (他们应该被指定为临时的);
  • 在使用 erlang:monitor/2 创建子项后创建监视器.每当子进程终止时,工厂都会收到一条消息。然后它可以重新启动 child 并为其提供状态;
  • 让 children 定期向工厂发送所需的信息。

  • 请注意,为了提高内存效率,您应该在单独的消息中从工厂恢复进程状态。事实上,如果你把保存的状态放在规范中,主管会保留一份副本。

    如果工厂倒闭,您可能还想确保 child 死亡。为此,您应该 link这两个过程。结果,而不是使用 erlang:monitor/2 ,您可以通过将进程配置为陷阱退出(使用 erlang:process_flag/2 )来配置您的工厂以接收 EXIT 消息。

    然而,这并不能解决问题,因为工厂本身可能会异常终止。它将由其主管重新启动,并且所有状态都将丢失,而无需进行适当的清理。因此,您需要确保在工厂终止时撤消对 child 开始需要做的事情。

    关于erlang - 如何检查进程是否被主管重新启动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18768773/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com