gpt4 book ai didi

erlang-otp - 如何在 escript 中运行 Elixir Supervisor

转载 作者:行者123 更新时间:2023-12-04 14:27:17 27 4
gpt4 key购买 nike

我有一个尽可能简单的主管和 GenServer 的混合项目。当我从 iex 打电话时:

EchoCmd.Supervisor.start_link([:Hello])
GenServer.call(:echoserver, :echo)
GenServer.call(:echoserver, :mumble)
GenServer.call(:echoserver, :echo)

:mumble 调用引发异常,然后 GenServer 重新启动,第二个 :echo 调用正常。

如果我以任何其他方式运行代码,Supervisor 将无法重新启动 GenServer。例如,我使用主模块创建项目的 escript,如下所示:
defmodule EchoCmd.Echo do
def main(args) do
EchoCmd.Supervisor.start_link([:Hello])
GenServer.call(:echoserver, :echo)
GenServer.call(:echoserver, :mumble)
GenServer.call(:echoserver, :echo)
end
end

:mumble 调用引发异常,并且 escript 终止,而 Supervisor 没有重新启动 GenServer。

我没有包含 Supervisor 和 Server 模块代码,因为它们在从 iex 调用时工作正常,所以我猜这里不需要它们。

我有概念上的误解吗?这是不可能的,还是我做错了什么?

最佳答案

问题不在于您的服务器和主管,而在于您调用它们的方式。如果服务器退出而另一个进程正在等待对 GenServer.call 的回复,调用进程也退出,所以最后一次调用永远不会发生。原因是如果同步调用失败( GenServer.call 是同步的,而不是 GenServer.cast ),进程不可能在无效状态下继续。如果您这样做只是为了测试主管,那么您可以尝试:

defmodule EchoCmd.Echo do
def main(args) do
EchoCmd.Supervisor.start_link([:Hello])
GenServer.cast(:echoserver, :echo)
GenServer.cast(:echoserver, :mumble)
GenServer.cast(:echoserver, :echo)
end
end

它在 iex 中起作用的原因是 iex捕获导出并允许您输入另一行。

关于erlang-otp - 如何在 escript 中运行 Elixir Supervisor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26963870/

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