2017-10-22 2 views
1

ある間隔で機能を実行するプログラムを作成したいと思います。私はまだエリクシルにとっては非常に新しく、どこでこれを始めるべきか本当に分かりません。私の考えは、GenServerを使用してメッセージをループして待機するプログラムを作成することができるので、メッセージ(おそらく:kick)を提供することができ、このメッセージを受け取ると関数が実行されます。タイマーでタスクを実行する

しかし、それは1つの問題を残します - どのように私はcronの仕事なしでそれを蹴るのですか?スレッドを起動し、一定間隔で起動するタイマーを実行できますか?メインスレッドが死んだ場合、通知を受けて再起動する簡単な方法はありますか?

ありがとうございました!

+0

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

+0

@Dogbertうわー。エリクシルのエルラン関数をどのように参照するのですか?私はそれを受け入れてポイントを与えることができるように答えとして小さな例を提供できますか? – 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は、スーパーバイザに「ワーカー」として追加することができます。何らかの理由でスーパバイザが終了した場合、スーパバイザはGenServerの再起動を処理できます。

0

@Dogbertは、のように使用されるErlangのsend_interval関数を使用して記述しています。

ただし、クイックグーグル検索では、the quantum-elixir libraryというように、スケジューリングのようなcronや実行時のタスクのスケジューリングが可能であるようです。

関連する問題