问题描述
我通过Supervisor,Dynamic Supervisor,有时只是直接的start_link,在我的应用程序中启动了多个(genserver)进程。当我使用import tensorflow as tf
x = tf.constant([3,5,7])
y = tf.constant([1,2,3])
z1 = tf.add(x,y)
z2 = x*y
z3 = z2-z1
print(z1)
print(z2)
print(z3)
tf.Tensor([ 4 7 10],shape=(3,),dtype=int32)
tf.Tensor([ 3 10 21],dtype=int32)
tf.Tensor([-1 3 11],dtype=int32)
启动应用程序时,其中一些可能会崩溃而不通知我。如果我自己没有捕获到崩溃,如何确保我从任何进程收到所有崩溃通知?在跟踪所有事件的同时,“让进程崩溃”的良好做法是什么?
iex -S mix
解决方法
如果回调(init / 1除外)执行以下操作之一,则会调用,terminate / 2 :
-返回:stop元组
-提高
调用Kernel.exit / 1
-返回无效值
-GenServer捕获出口(使用Process.flag / 2),父进程发送出口信号如果是监督树的一部分,GenServer将收到退出信号 当树关闭时。退出信号基于 儿童规范中的关机策略,
...
...
如果GenServer收到退出信号(不是:normal) 当它没有被捕获时从任何进程退出都会突然退出 出于同样的原因,所以不调用终止/ 2。注意一个过程 默认情况下不会捕获出口,并且当 链接的进程退出或其节点断开连接。因此,不能保证当a GenServer退出。因此,我们通常建议 通过使用以下方法在单独的过程中发生清理规则 监视或通过链接本身。当 GenServer控制端口(例如:gen_tcp.socket)或 File.io_device / 0,因为它们将在收到 GenServer的退出信号,不需要手动关闭 终止/ 2。
由于使用了@ 7stud,我最终使用的解决方案是在Elixir记录器中激活SASL和OTP登录。
如果使用混合,则可以将以下行添加到config/config.exs
:
config :logger,handle_otp_reports: true,handle_sasl_reports: true
有关更多信息,请参见elixir logger documentation。