elixir - 如何捕获 GenServer 终止 Elixir
问题描述
我有一个DynamicSupervisor
基本设置,我正在启动一个子 GenServer 作为
Supervisor.start_child(Recording.WorkerStarter, %{
id: String.to_atom(detailed_camera.name),
camera: detailed_camera,
sleep: detailed_camera.sleep
})
并将其终止为
name
|> Process.whereis()
|> case do
nil -> :not_found
pid -> DynamicSupervisor.terminate_child(__MODULE__, pid)
end
我想抓住它的终止,因为当我终止这个孩子时,我想记录一些东西。
我已经测试过terminate/2
了,Recording.WorkerStarter
但它不会被调用。
我试过handle_info({:DOWN, ref, :process, _, _}, state)
它不会工作。
我怎样才能赶上Recording.WorkerStarter
终止?
更新:
这是我的工人
defmodule Recording.WorkerStarter do
use GenServer
require Logger
def start_link(opts) do
IO.inspect("Started Recording.WorkerStarter")
{id, opts} = Map.pop!(opts, :id)
GenServer.start_link(__MODULE__, opts, name: id)
end
def init(state) do
schedule_fetch_call(state.sleep)
{:ok, state}
end
解决方案
我假设你:stop
从init/1
回调中返回。关于GenServer.terminate/2
状态的文档:
terminate/2
如果回调(除外init/1
)[...] ,则调用
也就是说,您可能会从那里经过GenServer.handle_continue/2
并:stop
从那里返回,或者在调用过程中存在陷阱Process.flag(:trap_exit, true)
。
推荐阅读
- haskell - Haskell 错误“数据构造函数不在范围内”
- google-cloud-platform - 项目计费经理与计费帐户用户 GCP
- assembly - ARM 汇编的 Cortex-M3/M4 定时器中断
- sql-server - 如何仅对差异为零的记录求和
- javascript - 如果执行者没有解决 ES6 JavaScript 承诺,它可以被其他任何东西解决吗?
- c# - 不能使用服务容器中的服务和默认值来实例化“MyProject.Response”类型的构造函数
- node.js - 当不能保证所有参数时,如何使用嵌套逻辑的 mongooseJs 进行搜索?
- mysql - 如何定义多对多链接表
- sql - 拆分在 Oracle 中没有分隔符的字符串
- php - Lavarel Auth::check() 不工作