У меня есть метод под названием _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
для этой цели?