我想创建一个在间隔上运行函数的程序。我对Elixir还很新,不知道从哪里开始。我的想法是,既然我们可以使用GenServer
创建一个程序来坐下来等待消息循环,我可以提供一条消息(可能是:kick
),当它收到此消息时它会运行功能。
然而,这留下了一个问题 - 如何在没有cron工作的情况下踢它?我可以启动一个线程并运行一个定时器,在一个间隔内踢它吗?如果主线程死了 - 是否有一种简单的方法可以通知并重新启动它?
谢谢!
答案 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,以及在运行时调度任务。