在计时器上运行任务

时间:2017-10-22 00:42:03

标签: multithreading timer elixir otp

我想创建一个在间隔上运行函数的程序。我对Elixir还很新,不知道从哪里开始。我的想法是,既然我们可以使用GenServer创建一个程序来坐下来等待消息循环,我可以提供一条消息(可能是:kick),当它收到此消息时它会运行功能。

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

谢谢!

2 个答案:

答案 0 :(得分:2)

您可以将timer:send_interval/2与GenServer一起使用。您需要从init/1回调中调用该函数,然后处理来自handle_info回调的tick消息。这是一个每秒打印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可以作为“工人”添加到主管。如果GenServer因任何原因退出,Supervisor可以处理重启GenServer。

答案 1 :(得分:0)

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

快速谷歌搜索,但是我the quantum-elixir library网络似乎能够像调度那样进行cron,以及在运行时调度任务。