gpt4 book ai didi

elixir - 使用 :simple_one_for_one strategy 时的子参数

转载 作者:行者123 更新时间:2023-12-01 12:29:14 24 4
gpt4 key购买 nike

当使用 :simple_one_for_one 策略时,我们指定子项动态启动:

supervise([worker(FooServer, [])], strategy: :simple_one_for_one)

然后我们使用类似下面的东西来启动 child :

def start_child(arg1, arg2) do
Supervisor.start_child(__MODULE__, [arg1, arg2])
end

documentation状态(强调我的):

In the case of :simple_one_for_one, the child specification defined in the supervisor will be used and instead of a child_spec, an arbitrary list of terms is expected. The child process will then be started by appending the given list to the existing function arguments in the child specification.

我尝试了以下方法

supervise([worker(FooServer, [:foo])], strategy: :simple_one_for_one)
# ^^^^
# "fixed" argument

但似乎没有附加参数,我找不到如何访问这些固定参数。甚至可以这样做吗?

最佳答案

我在iex中使用了如下代码:

defmodule Child do
def start_link(arg, arg2) do
IO.inspect(arg)
IO.inspect(arg2)

pid = spawn fn() ->
receive do
_any -> arg
end
end

{:ok, pid}
end
end

defmodule Sup do
use Supervisor

def start_link do
Supervisor.start_link(__MODULE__, [], name: __MODULE__)
end

def init(_args) do
children = [
worker(Child, [:arg], restart: :transient)
]

supervise(children, strategy: :simple_one_for_one)
end

def start_child do
Supervisor.start_child(__MODULE__, [:arg2])
end
end

这是我得到的行为:

iex(1)> Supervisor.start_link
{:ok, #PID<xxxxx>}
iex(2)> Supervisor.start_child
:arg
:arg2
{:ok, #PID<0.69.0>}

所以看起来它对我来说工作正常。在无法查看代码的情况下,很难就代码中发生的事情提供建议,但也许您的期望是您的参数是一个参数列表,而实际上您是将每个参数作为单独的参数接收。

关于elixir - 使用 :simple_one_for_one strategy 时的子参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35964064/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com