Допустимое использование genstage Elixir - PullRequest
1 голос
/ 27 мая 2020

У меня есть метод под названием _start_extractor/1, и я использую конечную точку Phoenix для его запуска, но с GenStage. например,

  defp start_snapshot_extractor(config) do
    name = :"snapshot_extractor_#{config.id}"
    case Process.whereis(name) do
      nil ->
        {:ok, pid} = GenStage.start_link(EvercamMedia.SnapshotExtractor.CloudExtractor, {}, name: name)
        pid
      pid -> pid
    end
    |> GenStage.cast({:snapshot_extractor, config})
  end

и в моем модуле EvercamMedia.SnapshotExtractor.CloudExtractor я просто делаю это.

defmodule EvercamMedia.SnapshotExtractor.CloudExtractor do
  use GenStage

  def init(args) do
    {:producer, args}
  end

  def handle_cast({:snapshot_extractor, config}, state) do
    _start_extractor(config)
    {:noreply, [], state}
  end

  defp _start_extractor(config) do
  end
end

, а затем вся работа происходит в _start_extractor(config). Это правильный нас GenStage? или просто для запуска процесса мне нужно GenStage или GenServer было бы лучше для него?

Также, когда я останавливаю / запускаю приложение Phoenix, я хочу возобновить процесс, поэтому я делаю например,

Process.whereis(:"snapshot_extractor_#{extractor.id}")
|> get_process_pid(EvercamMedia.SnapshotExtractor.CloudExtractor, extractor.id)
|> GenStage.cast({:snapshot_extractor, get_config(extractor, :cloud)})

Но я не уверен, что мне действительно нужно GenStage для этой цели?

...