2017-10-22 384 views
1

我想创建一个程序在一段时间内运行一个函数。我对Elixir仍然很陌生,不知道从哪里开始。我的想法是,既然我们可以用GenServer来创建一个程序来坐等在消息循环,我可以提供它的消息(也许:kick),当它接收到这个消息时,它会运行的功能。在定时器上运行一个任务

然而,留下一个问题 - 我怎么踢它不cron作业?我可以启动一个线程并运行一个定时器,并在一段时间内启动它吗?如果主线程死了 - 是否有一个简单的方法来通知并重新启动它?

谢谢!

+0

http://erlang.org/doc/man/timer.html#send_interval-3 – Dogbert

+0

@Dogbert哇大。我如何在elixir中引用erlang函数?你能否提供一个小例子作为答案,以便我可以接受并给你分数? – rec

回答

2

可以使用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 
... 

如果主线程死亡 - 是否有通知,并重新启动它的一个简单的方法?

你应该看看Supervisors。上面的GenServer可以作为“工作人员”添加到Supervisor。如果出于任何原因退出,Supervisor可以处理重新启动GenServer。

0

@Dogbert提到使用Erlang的send_interval函数,它的使用方式如下::timer.send_interval(milliseconds, process, message)

一个快速谷歌搜索然而,使我获得the quantum-elixir library这似乎是能够像调度的cron,以及在运行时的调度任务。