gpt4 book ai didi

elixir - 在Elixir/Mix/Phoenix应用中将服务/初始化代码放在哪里?

转载 作者:行者123 更新时间:2023-12-04 08:47:44 24 4
gpt4 key购买 nike

我有一个Elixir/Mix应用程序(也有Phoenix,也有很多非Phoenix的东西),我想知道放入“启动”代码的最佳实践是什么,例如将子级动态添加到主管,解雇之类的事情。 “我还活着!” ping或您希望在启动后立即发生的其他事情。

一个明显的地方是Application文件,但是期望的返回是Supervisor.start_link(children, opts)的返回。因此,例如,在Phoenix应用程序中,我可以这样做:

defmodule MyApp do
use Application

def start(_type, _args) do
import Supervisor.Spec

children = [
supervisor(MyApp.Repo, []),
supervisor(MyApp.Endpoint, []),
supervisor(MyApp.DynamicSupervisorThingy, [])
]
opts = [strategy: :one_for_one, name: MyApp.Supervisor]
start_val = Supervisor.start_link(children, opts)



# --- Put things right here that I want to start ----
MyApp.DynamicSupervisorThingy.add_children_dynamically()
MyApp.SomeModule.do_some_thingy()
MyApp.OtherModule.send_some_pings()
if MIX_ENV == :prod do
MyApp.YetAnother.prod_stuff_i_dont_want_in_dev()
end


start_val
end
end

这似乎是错误的,但是我不知道应该将这段代码放在哪里。

最佳答案

很好您的Phoenix应用程序只是一个OTP应用程序,您可以随意随意射击。 Application.start只需要一个{:ok, pid}元组,它基本上是应用程序的顶级过程。

我通常会先放置自定义的启动代码,然后设置主主管规范并启动该主管-请注意,如果在启动的“动态主管”和要添加的应用程序之间具有排序依赖性,就像上面的情况一样,您可能会因为计时问题而丢失-我已经在其规范中正确配置了该Supervisor,以便它可以在其init回调中执行操作,但是我不知道您的代码或您的要求。

无论如何,只要遵守契约(Contract),Application.start就是您所有的:-)

关于elixir - 在Elixir/Mix/Phoenix应用中将服务/初始化代码放在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43350425/

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