Spec-Zone.ru › Elixir 1.7

Supervisor.Spec

Этот модуль устарел. Используйте новые спецификации дочерних процессов, описанные в модуле Supervisor вместо этого.

Устаревшие функции для построения спецификаций дочерних процессов.

Функции в этом модуле устарели и не работают с основанными на модулях спецификациями дочерних процессов, представленными в Elixir v1.5. Пожалуйста, обратитесь к документации Supervisor вместо этого.

Функции для удобства определения спецификаций Supervisor.

Пример

Используя функции в этом модуле, можно указать дочерние процессы для использования под Supervisor, запущенные с помощью Supervisor.start_link/2:

import Supervisor.Spec

children = [
  worker(MyWorker, [arg1, arg2, arg3]),
  supervisor(MySupervisor, [arg1])
]

Supervisor.start_link(children, strategy: :one_for_one)

Иногда может быть удобно определять Supervisor, основанные на модуле:

defmodule MySupervisor do
  use Supervisor

  def start_link(arg) do
    Supervisor.start_link(__MODULE__, arg)
  end

  def init(arg) do
    children = [
      worker(MyWorker, [arg], restart: :temporary)
    ]

    supervise(children, strategy: :simple_one_for_one)
  end
end

Обратите внимание, что в этом случае нам не нужно явно импортировать Supervisor.Spec, так как use Supervisor автоматически делает это. Определение Supervisor, основанного на модуле, может быть полезно, например, для выполнения задач инициализации в c:init/1 обратном вызове.

Параметры Supervisor и рабочих процессов

В примере выше мы определили спецификации для рабочих процессов и Supervisor. Эти спецификации (как для рабочих процессов, так и для Supervisor) принимают следующие параметры:

  • :id - имя, используемое для идентификации спецификации дочернего процесса внутри Supervisor; по умолчанию устанавливается в имя модуля дочернего рабочего процесса/Supervisor

  • :function - функция, вызываемая для запуска дочернего процесса

  • :restart - атом, определяющий, когда завершившийся дочерний процесс должен быть перезапущен (см. раздел «Значения перезапуска» ниже)

  • :shutdown - атом, определяющий, как должен завершиться дочерний процесс (см. раздел «Значения завершения» ниже)

  • :modules - должен быть списком с одним элементом [module], где module — имя модуля обратного вызова только в том случае, если дочерний процесс является Supervisor или GenServer; если дочерний процесс является GenEvent, :modules должен быть :dynamic

Значения перезапуска (:restart)

В параметре :restart поддерживаются следующие значения перезапуска:

  • :permanent - дочерний процесс всегда перезапускается

  • :temporary - дочерний процесс никогда не перезапускается (даже когда стратегия Supervisor — :rest_for_one или :one_for_all)

  • :transient - дочерний процесс перезапускается только в случае аномального завершения, т. е. с причиной выхода, отличной от :normal, :shutdown или {:shutdown, term}

Обратите внимание, что Supervisor, достигший максимальной интенсивности перезапуска, выйдет с причиной :shutdown. В этом случае Supervisor будет перезапущен только в том случае, если его спецификация дочернего процесса была определена с :restart параметром, установленным в значение :permanent (по умолчанию).

Значения завершения (:shutdown)

В параметре :shutdown поддерживаются следующие значения завершения:

  • :brutal_kill - дочерний процесс безусловно завершается с помощью Process.exit(child, :kill)

  • :infinity - если дочерний процесс является Supervisor, это механизм для предоставления поддереву достаточно времени для завершения; его также можно использовать с рабочими процессами с осторожностью

  • любое целое число - значение :shutdown также может быть любым целым числом, означающим, что Supervisor сообщает дочернему процессу о завершении, вызвав Process.exit(child, :shutdown), а затем ожидает сигнал выхода обратно. Если сигнал выхода не получен в течение заданного времени (значение этого параметра в миллисекундах), дочерний процесс безусловно завершается с помощью Process.exit(child, :kill)

Сводка

Типы

child_id()

Поддерживаемые значения идентификаторов

modules()

Поддерживаемые значения модулей

restart()

Поддерживаемые значения перезапуска

shutdown()

Поддерживаемые значения завершения

spec()

Спецификация Supervisor

strategy()

Поддерживаемые стратегии

worker()

Поддерживаемые значения рабочих процессов

Функции

supervise(children, options)

Получает список дочерних процессов (рабочих процессов или Supervisor) для контроля и набор параметров

supervisor(module, args, options \\ [])

Определяет данный module как Supervisor, который будет запущен с заданными аргументами

worker(module, args, options \\ [])

Определяет данный module как рабочий процесс, который будет запущен с заданными аргументами

Типы

child_id()

child_id() :: term()

Поддерживаемые значения идентификаторов

modules()

modules() :: :dynamic | [module()]

Поддерживаемые значения модулей

restart()

restart() :: :permanent | :transient | :temporary

Поддерживаемые значения перезапуска

shutdown()

shutdown() :: timeout() | :brutal_kill

Поддерживаемые значения завершения

spec()

spec() ::
  {child_id(), start_fun :: {module(), atom(), [term()]}, restart(), shutdown(),
   worker(), modules()}

Спецификация Supervisor

strategy()

strategy() :: :simple_one_for_one | :one_for_one | :one_for_all | :rest_for_one

Поддерживаемые стратегии

worker()

worker() :: :worker | :supervisor

Поддерживаемые значения рабочих процессов

Функции

supervise(children, options)

supervise([spec()],
  strategy: strategy(),
  max_restarts: non_neg_integer(),
  max_seconds: pos_integer()
) :: {:ok, tuple()}

Получает список дочерних процессов (рабочих процессов или Supervisor) для контроля и набор параметров.

Возвращает кортеж, содержащий спецификацию Supervisor. Этот кортеж может быть использован в качестве значения возврата c:init/1 обратного вызова при реализации Supervisor, основанного на модуле.

Примеры

supervise(children, strategy: :one_for_one)

Параметры

  • :strategy - параметр стратегии перезапуска. Может быть :one_for_one, :rest_for_one, :one_for_all, или :simple_one_for_one. Более подробно о стратегиях можно узнать в документации модуля Supervisor.

  • :max_restarts - максимальное количество перезапусков, разрешенных в заданном временном интервале. По умолчанию 3.

  • :max_seconds - временной интервал, в котором применяется :max_restarts. По умолчанию 5.

Параметр :strategy обязателен и по умолчанию разрешает максимум 3 перезапуска в течение 5 секунд. Обратитесь к модулю Supervisor для подробного описания доступных стратегий.

supervisor(module, args, options \\ [])

supervisor(module(), [term()],
  restart: restart(),
  shutdown: shutdown(),
  id: term(),
  function: atom(),
  modules: modules()
) :: spec()

Определяет данный module как Supervisor, который будет запущен с заданными аргументами.

supervisor(ExUnit.Runner, [], restart: :permanent)

По умолчанию вызывается функция start_link для данного модуля. В целом, значения параметров по умолчанию:

[id: module,
 function: :start_link,
 restart: :permanent,
 shutdown: :infinity,
 modules: [module]]

См. документацию модуля Supervisor.Spec для получения дополнительной информации о параметрах.

worker(module, args, options \\ [])

worker(module(), [term()],
  restart: restart(),
  shutdown: shutdown(),
  id: term(),
  function: atom(),
  modules: modules()
) :: spec()

Определяет данный module как рабочий процесс, который будет запущен с заданными аргументами.

worker(ExUnit.Runner, [], restart: :permanent)

По умолчанию вызывается функция start_link для данного модуля. В целом, значения параметров по умолчанию:

[id: module,
 function: :start_link,
 restart: :permanent,
 shutdown: 5000,
 modules: [module]]

См. документацию модуля Supervisor.Spec для получения дополнительной информации о параметрах.

© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.7.4/Supervisor.Spec.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API