2017-10-22 165 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,以及在運行時的調度任務。