定时运行任务

3
我想创建一个程序,按照一定时间间隔运行一个函数。我对Elixir还非常陌生,不知道该从哪里开始。我的想法是,由于我们可以使用GenServer创建一个程序来循环等待消息,我可以提供一个消息(比如:kick),当它收到此消息时,就会运行该函数。
然而,这还有一个问题——如何在没有cron作业的情况下kick它呢?我能否启动一个线程并运行一个定时器,在每个时间间隔内kick它?如果主线程死亡,有没有一种简单的方法通知并重新启动它?
谢谢!

http://erlang.org/doc/man/timer.html#send_interval-3 - Dogbert
@Dogbert 哇,太好了。我要在Elixir中引用一个Erlang函数该怎么办?你能否提供一个小的例子作为答案,这样我就可以接受并给你点赞了吗? - user6467981
2个回答

10
你可以在GenServer中使用timer:send_interval/2。你需要从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可以作为“worker”添加到Supervisor中。 Supervisor可以处理如果GenServer因任何原因退出,则重新启动它。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接