21

Phoenixアプリケーションの隣で同じ一連の操作を何度も繰り返し実行したい(もちろん、ワーカーで何かが壊れた場合にWebアプリ全体をクラッシュさせることなく)、GenServer、Elixirのタスク、エージェント、またはこれまで考えたことのないまったく別のもの。

Phoenix アプリを起動すると、ワーカーも起動する必要があります。これは、定期的にシリアル接続の値を取得し、Phoenix チャネルを介してそれらをブロードキャストし、@save_interval到達するまでそれらを収集してから、中央値を計算し、別のチャネルを介してその中央値をブロードキャストし、 InfluxDB に書き込みます。今、私は次のようなもの(一種の作業)を持っています:

def do_your_thing(serial_pid) do
  Stream.interval(@interval_live)
    |> get_new_values_from_serial(serial_pid)
    |> broadcast!("live-channel:#{@name}")
    |> Enum.take(div(@interval_save, @interval_live))
    |> calculate_medians()
    |> broadcast!("update-channel:#{@name}")
    |> write_to_database()

  do_your_thing(serial_pid) # repeat
end

私はすべての OTP のことを理解し始めたばかりで、あなたの誰かが私がここで正しい方向につまずくのを手伝ってくれることを願っています.

4

1 に答える 1

33

x 秒 (下の例では 60 秒) 後にメッセージを送信する GenServer を使用する必要があります。

defmodule MyApp.Worker do
  use GenServer

  def start_link() do
    GenServer.start_link(__MODULE__, [])
  end

  def init([]) do
    schedule_work()
    {:ok, []}
  end

  def handle_info(:work, state) do
    state = do_work(state)
    schedule_work()
    {:noreply, state}
  end

  defp do_work(state) do
    # Do your work here and return state
  end

  defp schedule_work do
    Process.send_after(self(), :work, 60_000)
  end
end
于 2015-06-01T09:41:42.410 に答える