Erlang进程终止:在何处/何时发生?

Erlang进程终止:在何处/何时发生?,erlang,shutdown,otp,erlang-supervisor,Erlang,Shutdown,Otp,Erlang Supervisor,考虑所有链接在树中的流程,或者是一个正式的监督树,或者是一些特殊的结构 现在,考虑一下树上的一些孩子或工人,上面有家长或监督员。我有两个问题 如果需要终止或关闭此过程,我们希望优雅地退出此过程,因为它可能在更新某些帐户余额的中途完成。假设我们已经正确地编写了一些终止函数,并用适当的管道将这个过程连接到其他过程。现在假设这个过程在它的主循环中工作。终止的信号进来了。问题应该在什么地方,或者可能在什么时候,这种终止会发生?换句话说,何时调用终止?这个东西会正好在它的中间,它正在运行并呼叫终止吗?它会

考虑所有链接在树中的流程,或者是一个正式的监督树,或者是一些特殊的结构

现在,考虑一下树上的一些孩子或工人,上面有家长或监督员。我有两个问题

如果需要终止或关闭此过程,我们希望优雅地退出此过程,因为它可能在更新某些帐户余额的中途完成。假设我们已经正确地编写了一些终止函数,并用适当的管道将这个过程连接到其他过程。现在假设这个过程在它的主循环中工作。终止的信号进来了。问题应该在什么地方,或者可能在什么时候,这种终止会发生?换句话说,何时调用终止?这个东西会正好在它的中间,它正在运行并呼叫终止吗?它会一直等到循环结束,然后再开始循环吗?它只会在接收模式下执行吗?等等

相同的问题,但没有编码终止函数。假设父进程是主管,并且该子进程遵循正常的OTP约定。家长告诉孩子关机,或家长崩溃或其他。孩子们在它的主循环中。何时/何地/如何关闭?在主回路的中间?之后呢?等等


解释得很好

有两种情况:

由于某些错误的逻辑,进程终止。 <>它抛出一个错误,所以它可能在工作的中间,这可能是坏的。若要防止这种情况发生,可以尝试定义一种机制,它涉及两个过程。第一个开始事务,第二个完成实际工作,然后第一个提交更改。如果第二个进程发生了不好的事情,它就会因为错误而死亡,第一个进程就不会提交更改

您正试图从外部终止进程。例如,当您的主管重新启动或链接的进程终止时。

在这种情况下,你也可以处于某个中间,但是Erlang给了你TRAPXEXIT标志。这意味着,进程将接收一条消息,而不是死亡,您可以处理该消息。这反过来意味着,在到达接收块后,将调用终止函数。因此,进程将完成一块工作,当它准备好下一块工作时,它将调用terminate,并在这之后终止

因此,您可以使用trap_exit绕过退出。您还可以绕过trap_exit发送exitPid kill,它会终止进程,即使它捕获了退出


没有办法绕过exitPid、kill,所以使用它时要小心。

我认为文档中的解释不是很好,而且相当复杂,并且分布在各个章节,这就是我不得不问这个问题的原因。然而,你的答案是好的,所以我接受。如果你不使用陷阱退出,在当前植入中,当你耗尽还原或以某种方式暂停时,该过程将退出。这是当前实施的工作方式,不是保证。很少有人能保证异步信号何时被传递。