【问题标题】:Supervisor : can't terminate a child by pid主管:无法通过 pid 终止孩子
【发布时间】:2023-03-13 02:54:02
【问题描述】:

试图通过它的 pid 终止一个孩子是行不通的,它应该根据文档:https://hexdocs.pm/elixir/1.3.3/Supervisor.html#terminate_child/2

iex(7)> {:ok, sup} = Supervisor.start_link([], strategy: :one_for_one)                           
{:ok, #PID<0.383.0>}
iex(8)> {:ok, pid} = Supervisor.start_child(sup, worker(RData.ExpectedRefurbishmentCost, [self()]))
{:ok, #PID<0.385.0>}
iex(9)> Supervisor.terminate_child(sup, pid)                                                       
{:error, :not_found}

有什么让它起作用的线索吗?

【问题讨论】:

  • 文档说您需要为除simple_one_for_one 之外的所有策略传递子ID。 PID 仅适用于 simple_one_for_one
  • 我超出了这个范围......谢谢你的精确性:)

标签: elixir erlang-otp


【解决方案1】:

对于除:simple_one_for_one 之外的所有策略,您需要将子 ID 传递给 terminate_child。因此,对于:one_for_one,以下内容应该适合您,因为如果未提供id,则Supervisor.Spec.worker/3 将其设置为模块:

Supervisor.terminate_child(sup, RData.ExpectedRefurbishmentCost)

【讨论】:

    猜你喜欢
    • 2014-12-09
    • 2014-11-18
    • 2017-02-09
    • 2012-11-11
    • 2011-12-28
    • 2012-11-04
    • 2021-07-20
    • 2019-12-30
    • 1970-01-01
    相关资源
    最近更新 更多