【问题标题】:how to catch GenServer termination Elixir如何捕获 GenServer 终止 Elixir
【发布时间】:2021-01-05 23:28:36
【问题描述】:

我有一个带有基本设置的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

我想捕捉它的终止,因为当我终止这个孩子时,我想记录一些东西。

我在Recording.WorkerStarter 中测试了terminate/2,但它不会被调用。

我试过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

【问题讨论】:

    标签: elixir


    【解决方案1】:

    我假设您从 init/1 回调返回 :stopGenServer.terminate/2 上的文档指出:

    如果有回调(init/1 除外)[...]

    ,则调用terminate/2

    也就是说,您可能会通过GenServer.handle_continue/2 并从那里返回:stopProcess.flag(:trap_exit, true) 的调用过程中存在陷阱。

    【讨论】:

    • 我刚刚在 elixir repo 上看到了你的 PR,我知道你也会在这里回答 :D
    • 但我根本没看懂答案。
    • 我更新了工作代码,你能告诉我这个终止适合哪里吗?
    • Recording.WorkerStarter 的主管用Process.flag(:trap_exit) 捕获出口,您将在那里收到:DOWN 消息, terminate/2 将被调用。
    猜你喜欢
    • 2016-03-14
    • 2018-12-14
    • 1970-01-01
    • 2017-10-16
    • 2019-01-21
    • 2017-11-14
    • 2019-01-02
    • 2021-03-16
    • 2017-10-29
    相关资源
    最近更新 更多