在OTP应用程序中,我有以下简单的1级深度主管/工作人员设置。
如果启动"iex -S mix“并执行MyDemo.Supervisor.start_link({MyDemo.Worker,:start_link,[]}),则会得到以下错误输出。
( 1)为何会这样?似乎我在跟踪正确的函数签名。
代码
defmodule MyDemo.Supervisor do
use Supervisor
### API
def start_link({_, _, _} = mod_func_arg) do
Supervisor.start_link(__MODULE__, mod_func_arg)
end
def init({mod, func, arg} = x) do
opts_worker = [restart: :permanent, function: func]
children = worker(mod, arg, opts_worker)
#opts = [strategy: :simple_one_for_one, max_restarts: 5, max_seconds: 5]
opts = [strategy: :one_for_one, max_restarts: 5, max_seconds: 5]
supervise(children, opts)
end
end
defmodule MyDemo.Worker do
use GenServer
def start_link(_) do
GenServer.start_link(__MODULE__, :ok, [])
end
def stop(pid) do
GenServer.call(pid, :stop)
end
def handle_call(:stop, _from, state) do
{:stop, :normal, :ok, state}
end
end误差输出
** (退出#PID<0.255.0>)引发异常:** (Protocol.UndefinedError)协议枚举,不能用于{MyDemo.Worker,{MyDemo.Worker,:start_link,[]},:permanent,5000,:worker,MyDemo.Worker} (长生不老药) lib/enum.ex:1: Enumerable.impl_for!/1 (长生不老药) lib/enum.ex:116: Enumerable.Reach/3(长生不老药) lib/enum.ex:1776: Enum.map/2 (灵丹妙药) lib/supervisor/spec.ex:169: Supervisor.spec.Super.2 (stdlib) supervisor.erl:272::visor.init/1(stdlib) gen_server.erl:328::gen_server.init_it/6 (stdlib) proc_lib.erl:240::proc_lib.init_p_do_apply/3
发布于 2017-05-01 02:41:10
试一试
children = [worker(mod, arg, opts_worker)]supervise函数将列表作为其第一个参数。
在错误消息中
(Protocol.UndefinedError) protocol Enumerable not implemented for {MyDemo.Worker, ...}您可以看到两个元组,它是关键字键和值的条目。但是,它没有包装在[]中,因此这是输入未被指定为列表的后一步。
https://stackoverflow.com/questions/43713155
复制相似问题