Я хочу многократно запускать одну и ту же последовательность операций снова и снова рядом с приложением Phoenix (без сбоя всего веб-приложения, если что-то тормозит в воркере, конечно) и действительно не знаю, следует ли мне использовать GenServer, Elixir's Задачи, Агент или что-то совсем другое, о чем я пока не думал.
Когда я запускаю свое приложение 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 и надеюсь, что кто-то из вас поможет мне наткнуться на правильное направление.