【发布时间】:2016-09-01 16:46:03
【问题描述】:
我有一个简单的主管模块,例如:
defmodule Final.Users.Supervisor do
use Supervisor
def start_link, do: Supervisor.start_link(__MODULE__, :ok, name: __MODULE__)
def init(:ok) do
children = [
worker(Final.UserServer, [], restart: :temporary)
]
supervise(children, strategy: :simple_one_for_one)
end
def create_user(id), do: Supervisor.start_child(__MODULE__, [id])
end
在应用程序启动时我想做的是查找数据库并为 db 中的每个用户条目调用 create_user/1。
我在 init 中尝试了 Process.send_after()... 但它给出了错误(** (EXIT) 进程试图调用自身)
在这个模块中尝试这样做是否有意义?我是否应该设置另一个工作人员(genserver),然后查询数据库并调用此 Users.Supervisor.create_user/1 ?示例:
defmodule Final.Users.Starter do
alias Final.Repo
alias Final.Users.Supervisor, as: Sup
import Ecto.Query, only: [from: 2]
use GenServer
def start_link() do
GenServer.start_link(__MODULE__, :ok, name: __MODULE__)
end
def init(:ok) do
Process.send_after(self(), :started, 0)
{:ok, %{}}
end
def handle_info(:started, %{}) do
query = from(p in "users",
select: p.id)
ids = Final.Repo.all(query)
Enum.each(ids, fn(x) -> Sup.create_user(x) end)
{:noreply, %{}}
end
end
【问题讨论】:
-
“我在 init 中尝试了 Process.send_after()... 但它给出了错误(** (EXIT) 进程试图调用自身)”
Process.send_after/3ininit/1对我来说很好GenServer(我复制了你的Final.Users.Starter并删除了 Ecto 和 Supervisor 相关的东西)。你能发布你得到的那个错误的堆栈跟踪吗?该错误仅在进程尝试向自身发送GenServer.call时引发(这将导致死锁)。
标签: elixir