运行 计时器上的任务
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 可以处理重新启动它。
我想创建一个 运行 间隔函数的程序。我对 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 可以处理重新启动它。