运行 计时器上的任务

Running a task on a timer

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

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

谢谢!

@Dogbert 提到使用 Erlang 中的 send_interval 函数,可以这样使用::timer.send_interval(milliseconds, process, message).

然而,通过快速 Google 搜索,我 the quantum-elixir library 发现它似乎能够进行类似 cron 的调度,以及在运行时调度任务。

您可以将 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
iex(1)> GenServer.start_link(A, [])
{:ok, #PID<0.94.0>}
0
1
2
3
4
...

If the main thread dies - is there an easy way to be notified and restart it?

你应该调查一下 Supervisors。上面的 GenServer 可以作为 "worker" 添加到 Supervisor。如果 GenServer 因任何原因退出,Supervisor 可以处理重新启动它。