为什么 Supervisor.start_child 不起作用
Why Supervisor.start_child dont work
我是 Elixir 的初学者。
我有一个应用程序在 application.ex 中启动了一个自定义主管。代码:
defmodule MyApp do
use Application
def start(_type, _args) do
import Supervisor.Spec
children = [
supervisor(MyApp.Web.Endpoint, []),
supervisor(MyApp.Repo, []),
#my notifier
MyApp.MyNotifier.Supervisor
]
opts = [strategy: :one_for_one, name: MyApp.Supervisor]
Supervisor.start_link(children, opts)
end
end
supervisor 的代码是这样的:
defmodule MyApp.MyNotifier.Supervisor do
use Supervisor
def start_link(_options), do:
Supervisor.start_link(__MODULE__, :ok, name: __MODULE__)
def start_my_notifier(state) do
Supervisor.start_child(__MODULE__, state)
end
def init(:ok) do
Supervisor.init([], strategy: :one_for_one)
end
end
工人的代码是这样的:
defmodule MyApp.MyNotifier do
use GenServer
# Client
def start_link(state) do
GenServer.start_link(__MODULE__, state)
end
# Server
def init(state) do
# Reschedule
reschedule(state)
# Reply
{:ok, state}
end
def handle_info(:reschedule, state) do
case state["count"] < 9 do
true ->
# Send notification
MyNotifier.Helper.notify_past_delivery_time(sate["id"])
# Reschedule once more
reschedule(state)
false ->
# End process
Process.exit(self(), :normal)
end
{:noreply, state}
end
defp reschedule(state) do
Process.send_after(self(), :reschedule, state["time"] * 60 * 1000)
end
end
当我的应用程序发生某些事情时,我希望 add/start 动态地使用以下代码的工作人员:
MyNotifier.Supervisor.start_my_notifier(%{"name" => name, "id" => id, "time" => 15, "count" => 0})
当我 运行 我的应用程序处于调试模式时 (iex -S mix phx.server) 并在 worker 的初始化函数中放置一个 IEx.pry (然后我们强制应用程序去到开始 child 的状态)。为什么应用程序永远不会停止?
调用 Supervisor.start_child/2
的第二个参数应该是子规范,而不是:
Supervisor.start_child(__MODULE__, state)
应该有点像:
Supervisor.start_child(__MODULE__, [self(), MyApp.MyNotifier, [state]])
我在主管代码中更改了 simple_one_for_one 的主管策略。
Supervisor.init([], strategy: :simple_one_for_one)
这对我有用。
我是 Elixir 的初学者。
我有一个应用程序在 application.ex 中启动了一个自定义主管。代码:
defmodule MyApp do
use Application
def start(_type, _args) do
import Supervisor.Spec
children = [
supervisor(MyApp.Web.Endpoint, []),
supervisor(MyApp.Repo, []),
#my notifier
MyApp.MyNotifier.Supervisor
]
opts = [strategy: :one_for_one, name: MyApp.Supervisor]
Supervisor.start_link(children, opts)
end
end
supervisor 的代码是这样的:
defmodule MyApp.MyNotifier.Supervisor do
use Supervisor
def start_link(_options), do:
Supervisor.start_link(__MODULE__, :ok, name: __MODULE__)
def start_my_notifier(state) do
Supervisor.start_child(__MODULE__, state)
end
def init(:ok) do
Supervisor.init([], strategy: :one_for_one)
end
end
工人的代码是这样的:
defmodule MyApp.MyNotifier do
use GenServer
# Client
def start_link(state) do
GenServer.start_link(__MODULE__, state)
end
# Server
def init(state) do
# Reschedule
reschedule(state)
# Reply
{:ok, state}
end
def handle_info(:reschedule, state) do
case state["count"] < 9 do
true ->
# Send notification
MyNotifier.Helper.notify_past_delivery_time(sate["id"])
# Reschedule once more
reschedule(state)
false ->
# End process
Process.exit(self(), :normal)
end
{:noreply, state}
end
defp reschedule(state) do
Process.send_after(self(), :reschedule, state["time"] * 60 * 1000)
end
end
当我的应用程序发生某些事情时,我希望 add/start 动态地使用以下代码的工作人员:
MyNotifier.Supervisor.start_my_notifier(%{"name" => name, "id" => id, "time" => 15, "count" => 0})
当我 运行 我的应用程序处于调试模式时 (iex -S mix phx.server) 并在 worker 的初始化函数中放置一个 IEx.pry (然后我们强制应用程序去到开始 child 的状态)。为什么应用程序永远不会停止?
调用 Supervisor.start_child/2
的第二个参数应该是子规范,而不是:
Supervisor.start_child(__MODULE__, state)
应该有点像:
Supervisor.start_child(__MODULE__, [self(), MyApp.MyNotifier, [state]])
我在主管代码中更改了 simple_one_for_one 的主管策略。
Supervisor.init([], strategy: :simple_one_for_one)
这对我有用。