我想创建一个按时间间隔运行函数的程序。我对 Elixir 还是很陌生,不知道从哪里开始。我的想法是,既然我们可以使用 GenServer
创建一个程序来循环等待消息,我可以向它提供消息(可能是 :kick
)以及何时它收到此消息,它将运行该函数。
但是,这留下了一个问题 - 我如何在没有 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 可以处理重启。
关于multithreading - 在计时器上运行任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46869458/