2017-10-22 3 views
1

Ich möchte ein Programm erstellen, das eine Funktion in einem Intervall ausführt. Ich bin Elixir immer noch sehr neu und weiß nicht wirklich, wo ich damit anfangen soll. Meine Idee ist, dass, weil wir GenServer verwenden können, um ein Programm zu erstellen, um in einer Schleife für Nachrichten zu warten und zu warten, ich könnte es eine Nachricht bereitstellen (möglicherweise :kick) und wenn es diese Nachricht empfängt, würde es die Funktion ausführen.Einen Task auf einem Timer ausführen

Das lässt jedoch ein Problem - wie kicke ich es ohne einen Cron-Job? Kann ich einen Thread starten und einen Timer laufen lassen, der ihn in einem Intervall startet? Wenn der Haupt-Thread abstirbt - gibt es einen einfachen Weg, um benachrichtigt zu werden und ihn neu zu starten?

Vielen Dank!

+0

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

+0

@Dogbert Wow großartig. Wie referenziere ich eine Erlang-Funktion in Elixier? Könnten Sie ein kleines Beispiel als Antwort geben, damit ich es akzeptieren und Ihnen Punkte geben kann? – rec

Antwort

2

Sie können timer:send_interval/2 mit einem GenServer verwenden. Sie müssen die Funktion vom Rückruf init/1 aufrufen und dann die Tick-Nachrichten vom Rückruf handle_info behandeln. Hier ist ein Beispiel, das 0 druckt, 1, 2, ... jede Sekunde:

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 
... 

Wenn der Haupt-Thread stirbt - ist es eine einfache Möglichkeit informiert werden und es neu starten?

Sie sollten in Supervisors suchen. Der obige GenServer kann einem Supervisor als "Worker" hinzugefügt werden. Der Supervisor kann den GenServer neu starten, wenn er aus irgendeinem Grund beendet wird.

0

@Dogbert erwähnt mit der Verwendung der send_interval Funktion von Erlang, die wie folgt verwendet werden würde: :timer.send_interval(milliseconds, process, message).

Eine schnelle Google-Suche jedoch, vereinigte mich the quantum-elixir library, die in der Lage zu Cron wie Terminplanung scheint, sowie Aufgaben zur Laufzeit planen.