我想創建一個程序在一段時間內運行一個函數。我對Elixir仍然很陌生,不知道從哪裏開始。我的想法是,既然我們可以用GenServer
來創建一個程序來坐等在消息循環,我可以提供它的消息(也許:kick
),當它接收到這個消息時,它會運行的功能。在定時器上運行一個任務
然而,留下一個問題 - 我怎麼踢它不cron作業?我可以啓動一個線程並運行一個定時器,並在一段時間內啓動它嗎?如果主線程死了 - 是否有一個簡單的方法來通知並重新啓動它?
謝謝!
我想創建一個程序在一段時間內運行一個函數。我對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
...
如果主線程死亡 - 是否有通知,並重新啓動它的一個簡單的方法?
你應該看看Supervisors。上面的GenServer可以作爲「工作人員」添加到Supervisor。如果出於任何原因退出,Supervisor可以處理重新啓動GenServer。
@Dogbert提到使用Erlang的send_interval
函數,它的使用方式如下::timer.send_interval(milliseconds, process, message)
。
一個快速谷歌搜索然而,使我獲得the quantum-elixir
library這似乎是能夠像調度的cron,以及在運行時的調度任務。
http://erlang.org/doc/man/timer.html#send_interval-3 – Dogbert
@Dogbert哇大。我如何在elixir中引用erlang函數?你能否提供一個小例子作爲答案,以便我可以接受並給你分數? – rec