首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >灵丹妙药的GenServer handle_call,handle_info,handle_cast没有被调用

灵丹妙药的GenServer handle_call,handle_info,handle_cast没有被调用
EN

Stack Overflow用户
提问于 2019-08-09 10:41:41
回答 1查看 835关注 0票数 0

我实现了一个简单的Application -> DynamicSupervisor系统,Application在启动时创建一个单一的DynamicSupervisor,然后向它发送一条消息来启动一些工作。问题是,没有一个消息(通过GenServer的cast,内核的send)真正被捕获。尝试GenServer.call()引发以下错误

DynamicSupervisor.handle_call/3中没有匹配的函数子句

这是奇怪的,因为我已经实现了它(到那个规范)。我确信DynamicSupervisor模块会启动,而不会在启动时退出。

应用模块代码:

代码语言:javascript
复制
defmodule Simulacra.Application do
  use Application

  def start(_type, _args) do
    children = [
      Simulacra.MainSupervisor
    ]

    opts = [strategy: :one_for_one, name: Simulacra.Supervisor]
    {:ok, pid} = Supervisor.start_link(children, opts)
    start_supervisors(Supervisor.which_children(pid))
    {:ok, pid}
  end

  defp start_supervisors([h|_t] = list) when is_list(list) do
    {_, pid, _, _} = h
    start_supervisors(pid)
  end

  defp start_supervisors([]) do
    #noop
    IO.puts "Something"
  end

  defp start_supervisors(pid) do
    GenServer.cast(pid, :start)
    send(pid, :ping)
    GenServer.call(pid, :ping) <-- Throws an error
  end
end

主管代码:

代码语言:javascript
复制
defmodule Simulacra.MainSupervisor do
  @moduledoc false
  use DynamicSupervisor

  def start_link([]) do
    DynamicSupervisor.start_link(__MODULE__, [], name: __MODULE__)
  end

  def init(_noop) do
    DynamicSupervisor.init(strategy: :one_for_one)
  end

  def handle_info(:ping, state) do
    IO.puts "sth"
  end

  def handle_cast(:start, state) do
    # do_something
    {:noreply, state}
  end

  def handle_call(:ping, _from, _x) do
    {:reply, "bing", "bong"}
  end
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-09 11:00:37

DynamicSupervisor behaviour的自定义实现。

它所具有的唯一可过脊函数是child_spec/1

您的casts虽然实际上被忽略了。当您强制传递消息或发送信息时,当进程无法处理消息(甚至不存在)时,VM只会忽略它。call/3是同步的,因此发送方期望回复,这就是您看到它引发的原因。

尝试GenServer.cast pid, :foo,您将收到:ok返回,因为这些消息没有承诺要传递。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57428381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档