为何GenServer捕获:kill退出却无法捕获自定义原因的退出?
问题描述
编辑:我完全错了……这个GenServer示例没有意义,因为实际代码更复杂(一个启动其他GenServer并运行任务的GenServer),结果是我退出了错误的进程,还混淆了日志。抱歉。
我有一个开启退出捕获的GenServer。当我调用Process.exit(pid, :kill)时,handle_info回调会被触发,但如果使用其他退出原因,该回调从未被触发。
简化后的GenServer代码
defmodule Example do use GenServer def start(args, opts \\ []) do GenServer.start(__MODULE__, args, opts) end def init({task, meta}) do Process.flag(:trap_exit, true) end def kill do Process.exit(self, :not_kill_reason) end def handle_info({:EXIT, pid, reason}, state) do IO.puts("handle_info, reason: #{reason}") {:stop, :normal, nil} end end
文档相关说明
根据Elixir官方文档:
如果进程开启了退出捕获,退出信号会被转换成
{:EXIT, from, reason}消息并发送到该进程的消息队列。如果退出原因是原子
:kill,也就是调用Process.exit(pid, :kill)时,会向目标进程发送一个不可捕获的退出信号,进程会无条件以:killed原因退出。
结果……我居然搞反了,:kill能触发handle_info,但:not_kill_reason却不行:/
内容的提问来源于stack exchange,提问作者addUsername
相关产品推荐
相关产品推荐

