我想在Phoenix应用程序旁边反复运行相同的操作序列(当然,如果某些东西在工作人员中刹车,则不会崩溃整个Web应用程序)并且我真的不知道我应该使用GenServer,Elixir的任务,代理人或者我到目前为止没有想过的完全不同的东西。
当我启动我的Phoenix应用程序时,工作人员也应该启动,定期提取串行连接的某些值,通过Phoenix通道广播它们,收集它们直到达到@save_interval
然后计算中位数,通过不同的通道广播中值并将其写入InfluxDB。现在我有这样的东西(有点工作):
def do_your_thing(serial_pid) do
Stream.interval(@interval_live)
|> get_new_values_from_serial(serial_pid)
|> broadcast!("live-channel:#{@name}")
|> Enum.take(div(@interval_save, @interval_live))
|> calculate_medians()
|> broadcast!("update-channel:#{@name}")
|> write_to_database()
do_your_thing(serial_pid) # repeat
end
我只是开始想出所有OTP的东西,并希望你们中的某些人可以帮助我在这里找到正确的方向。
答案 0 :(得分:32)
您应该使用在x秒后发送消息的GenServer(在下面的示例中为60秒):
defmodule MyApp.Worker do
use GenServer
def start_link() do
GenServer.start_link(__MODULE__, [])
end
def init([]) do
schedule_work()
{:ok, []}
end
def handle_info(:work, state) do
state = do_work(state)
schedule_work()
{:noreply, state}
end
defp do_work(state) do
# Do your work here and return state
end
defp schedule_work do
Process.send_after(self(), :work, 60_000)
end
end