Elixir 菲尼克斯:主管忽略名称,新流程
我有一个Elixir 菲尼克斯:主管忽略名称,新流程,elixir,phoenix-framework,Elixir,Phoenix Framework,我有一个应用程序.ex如下所示: defmodule Qtrain.Application do use Application def start(_type, _args) do import Supervisor.Spec children = [ supervisor(QtrainWeb.Endpoint, [], name: Qtrain.Supervisor), supervisor(Qtrain.Requests, [], nam
应用程序.ex
如下所示:
defmodule Qtrain.Application do
use Application
def start(_type, _args) do
import Supervisor.Spec
children = [
supervisor(QtrainWeb.Endpoint, [], name: Qtrain.Supervisor),
supervisor(Qtrain.Requests, [], name: Qtrain.Requests)
]
Supervisor.start_link(children, strategy: :one_for_one)
end
def config_change(changed, _new, removed) do
QtrainWeb.Endpoint.config_change(changed, removed)
:ok
end
end
defmodule Qtrain.Requests do
use GenServer
alias Qtrain.Requests.Document
def start_link do
GenServer.start_link(__MODULE__, %{})
end
def init(state) do
schedule_work()
{:ok, state}
end
def handle_info(:work, state) do
Document.start_link %{id: :one}
schedule_work()
{:noreply, state}
end
defp schedule_work() do
Process.send_after(self(), :work, 1 * 1000)
end
end
还有一个requests.ex
,看起来像这样:
defmodule Qtrain.Application do
use Application
def start(_type, _args) do
import Supervisor.Spec
children = [
supervisor(QtrainWeb.Endpoint, [], name: Qtrain.Supervisor),
supervisor(Qtrain.Requests, [], name: Qtrain.Requests)
]
Supervisor.start_link(children, strategy: :one_for_one)
end
def config_change(changed, _new, removed) do
QtrainWeb.Endpoint.config_change(changed, removed)
:ok
end
end
defmodule Qtrain.Requests do
use GenServer
alias Qtrain.Requests.Document
def start_link do
GenServer.start_link(__MODULE__, %{})
end
def init(state) do
schedule_work()
{:ok, state}
end
def handle_info(:work, state) do
Document.start_link %{id: :one}
schedule_work()
{:noreply, state}
end
defp schedule_work() do
Process.send_after(self(), :work, 1 * 1000)
end
end
当我启动我的应用程序并运行:observer.start
时,我可以按预期使用:一个键查看任务,但有两件事出错。第一,尽管我在iex-S mix
中指定了一个和两个后续过程,但家长主管没有名字,就像这样:
Qtrain.Requests.Document.start_link %{id: :dammit}
不要导致在pid
下添加进程
但是,它们确实会显示在“流程”选项卡中:
有什么原因我不能说出那个主管的名字吗?为什么新流程不会出现在它下面
将name
选项传递给Supervisor.Spec.Supervisor/3
在这两种情况下都没有效果(检查observer
是否为端点显示端点
,而name
设置为Supervisor
),事实上甚至没有效果。您应该在调用后续的GenServer.start\u链接(\uuuuu MODULE\uuuuuu,%%{},名称:\uuuu MODULE\uuuuu)
中设置名称,以使其显示在observer
中
Whatever.start\u链接
不会使已启动的流程成为监督树的一部分。您应该明确地将其设置为相应主管的子级(如果父级是主管,而不是您的案例),或者只需调用Document。从相应GenServer
流程中启动链接
start\u link
启动链接到当前进程的GenServer
进程
例如:
defmodule Qtrain.Requests do
# interface
def document!(id) do
GenServer.call(__MODULE__, {:document, id})
end
def handle_call({:document, id}, _from, state) do
Qtrain.Requests.Document.start_link %{id: id}
end
...
end
现在:
Qtrain.Requests.document! :damnit
将文档
作为监督树的一部分,因为它将链接到请求
流程。当您刚从控制台启动它时,它被链接到mix
进程
将name
选项传递给Supervisor.Spec.Supervisor/3
在这两种情况下都没有效果(检查observer
是否为端点显示端点
,而name
设置为Supervisor
),事实上甚至没有效果。您应该在调用后续的GenServer.start\u链接(\uuuuu MODULE\uuuuuu,%%{},名称:\uuuu MODULE\uuuuu)
中设置名称,以使其显示在observer
中
Whatever.start\u链接
不会使已启动的流程成为监督树的一部分。您应该明确地将其设置为相应主管的子级(如果父级是主管,而不是您的案例),或者只需调用Document。从相应GenServer
流程中启动链接
start\u link
启动链接到当前进程的GenServer
进程
例如:
defmodule Qtrain.Requests do
# interface
def document!(id) do
GenServer.call(__MODULE__, {:document, id})
end
def handle_call({:document, id}, _from, state) do
Qtrain.Requests.Document.start_link %{id: id}
end
...
end
现在:
Qtrain.Requests.document! :damnit
将文档
作为监督树的一部分,因为它将链接到请求
流程。当您刚从控制台启动它时,它被链接到mix
过程。我不可能要求更全面的答案。非常感谢。我正在从Rails移动sidekiq应用程序,并在OTP尝试我的运气。祝你好运!我个人觉得从ruby到elixir是非常直接的,坦率地说,令人兴奋的,因为有很多事情(特别是OTP)。我不可能要求更彻底的答案。非常感谢。我正在从Rails移动sidekiq应用程序,并在OTP尝试我的运气。祝你好运!我个人觉得从ruby到elixir的转变非常直接,坦率地说,令人兴奋,因为有很多事情(特别是OTP)