我实现了一个简单的Application -> DynamicSupervisor系统,Application在启动时创建一个单一的DynamicSupervisor,然后向它发送一条消息来启动一些工作。问题是,没有一个消息(通过GenServer的cast,内核的send)真正被捕获。尝试GenServer.call()引发以下错误
DynamicSupervisor.handle_call/3中没有匹配的函数子句
这是奇怪的,因为我已经实现了它(到那个规范)。我确信DynamicSupervisor模块会启动,而不会在启动时退出。
应用模块代码:
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主管代码:
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发布于 2019-08-09 11:00:37
DynamicSupervisor是 behaviour的自定义实现。
它所具有的唯一可过脊函数是child_spec/1。
您的casts虽然实际上被忽略了。当您强制传递消息或发送信息时,当进程无法处理消息(甚至不存在)时,VM只会忽略它。call/3是同步的,因此发送方期望回复,这就是您看到它引发的原因。
尝试GenServer.cast pid, :foo,您将收到:ok返回,因为这些消息没有承诺要传递。
https://stackoverflow.com/questions/57428381
复制相似问题