Nano Hash - криптовалюты, майнинг, программирование

Как использовать Task.await с GenServer?

Пытаюсь понять, как запустить genserver, и жду результата, пока он не закончит.

Как мне заставить сервер возвращать результат при выходе?

как например:

defmodule DistanceMatrix do
  use GenServer

  def start id do
    GenServer.start(__MODULE__, id)
  end

  def load() do
    GenServer.cast({:load})
  end

  def handle_cast({:load}, state) do
    # start long process operation
    long_process
    {:noreply, state}
  end

  def long_process do
    :timer.sleep 2000
    %{result: "Process result.."}
  end

end 


results= ids
|> Enum.map(fn id -> DistanceMatrix.start(id) end)
|> Enum.map(&Task.await/1)
|> Enum.map(fn({:ok, result}) -> 
   result
   end)

Итак, как мне подождать и получить результат?

16.07.2018

  • Как насчет того, чтобы изменить все cast на call и вызвать load вместо Task.await? 16.07.2018
  • Я хочу обрабатывать все идентификаторы одновременно, я пробовал call, но у меня идентификаторы обрабатывались последовательно, а не параллельно. 16.07.2018

Ответы:


1

Вот один способ: в :load cast вернуть результат long_process в качестве нового состояния. Затем добавьте call, который просто возвращает текущее состояние (с именем :get ниже). Поскольку GenServer обрабатывает сообщения последовательно в порядке их отправки, вызов :get будет блокироваться до завершения предыдущего :load.

defmodule DistanceMatrix do
  use GenServer

  def start(id) do
    GenServer.start(__MODULE__, id)
  end

  def load(pid) do
    GenServer.cast(pid, {:load})
    pid
  end

  def await(pid), do: GenServer.call(pid, :get)

  def init(id), do: {:ok, id}

  def handle_call(:get, _, state), do: {:reply, state, state}

  def handle_cast({:load}, _state) do
    {:noreply, long_process()}
  end

  def long_process do
    :timer.sleep(2000)
    %{result: "Process result.."}
  end
end

1..10
|> Enum.map(fn id ->
  {:ok, pid} = DistanceMatrix.start(id)
  pid
end)
|> Enum.map(&DistanceMatrix.load/1)
|> Enum.map(&DistanceMatrix.await/1)
|> Enum.map(fn result ->
  IO.inspect(result)
end)

Выход:

%{result: "Process result.."}
%{result: "Process result.."}
%{result: "Process result.."}
%{result: "Process result.."}
%{result: "Process result.."}
%{result: "Process result.."}
%{result: "Process result.."}
%{result: "Process result.."}
%{result: "Process result.."}
%{result: "Process result.."}

Как и ожидалось, программа занимает чуть больше 2 секунд.

16.07.2018
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..