在计时器上运行任务

3 multithreading timer elixir erlang-otp

我想创建一个以间隔运行函数的程序。我对 Elixir 还是很陌生,不知道从哪里开始。我的想法是,由于我们可以GenServer用来创建一个程序来等待消息的循环,我可以向它提供一条消息(也许:kick),当它收到这条消息时,它会运行该函数。

但是,这留下了一个问题 - 我如何在没有 cron 工作的情况下踢它?我可以启动一个线程并运行一个计时器,以间隔时间启动它吗?如果主线程死了 - 有没有一种简单的方法来通知并重新启动它?

谢谢!

Dog*_*ert 7

您可以timer:send_interval/2与 GenServer 一起使用。您需要从init/1回调中调用该函数,然后处理来自handle_info回调的滴答消息。这是一个每秒打印 0, 1, 2, ... 的示例:

defmodule A do
  use GenServer

  def init(_) do
    :timer.send_interval(1000, :tick)
    {:ok, 0}
  end

  def handle_info(:tick, state) do
    IO.inspect state
    {:noreply, state + 1}
  end
end
Run Code Online (Sandbox Code Playgroud)
iex(1)> GenServer.start_link(A, [])
{:ok, #PID<0.94.0>}
0
1
2
3
4
...
Run Code Online (Sandbox Code Playgroud)

如果主线程死了 - 有没有一种简单的方法来通知并重新启动它?

你应该看看Supervisors。上面的 GenServer 可以作为“工人”添加到主管。如果 GenServer 出于任何原因退出,Supervisor 可以处理重新启动 GenServer。