【问题标题】:Running a task on a timer在计时器上运行任务
【发布时间】:2018-04-02 19:50:44
【问题描述】:

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

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

谢谢!

【问题讨论】:

标签: multithreading timer elixir erlang-otp


【解决方案1】:

您可以将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
...

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

您应该查看Supervisors。上面的 GenServer 可以作为“worker”添加到 Supervisor。如果 GenServer 因任何原因退出,Supervisor 可以处理重启。

【讨论】:

    【解决方案2】:

    @Dogbert 提到使用 Erlang 的 send_interval 函数,它的使用方式如下::timer.send_interval(milliseconds, process, message)。

    然而,通过 Google 快速搜索,我找到了 the quantum-elixir library,它似乎能够像 cron 一样调度,以及在运行时调度任务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-04
      • 1970-01-01
      • 1970-01-01
      • 2016-08-14
      • 1970-01-01
      • 1970-01-01
      • 2021-02-01
      相关资源
      最近更新 更多