Spec-Zone.ru › Elixir 1.6

Supervisor.Spec

ПРЕДУПРЕЖДЕНИЕ: этот модуль устарел.

Функции в этом модуле устарели и не работают с основанными на модулях дочерними спецификациями, представленными в Elixir v1.5. Пожалуйста, обратитесь к документации 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)

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

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 автоматически делает это. Определение супервайзера на основе модуля может быть полезным, например, для выполнения задач инициализации в c:init/1 обратном вызове.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Резюме

Типы

child_id()

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

modules()

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

restart()

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

shutdown()

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

spec()

Спецификация супервайзера

strategy()

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

worker()

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

Функции

supervise(children, options)

Получает список дочерних элементов (работников или супервайзеров) для наблюдения и набор параметров

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

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

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()}

Спецификация супервайзера

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()}

Получает список дочерних элементов (работников или супервайзеров) для наблюдения и набор параметров.

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

Примеры

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(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.6.6/Supervisor.Spec.html

Spec-Zone.ru

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