Spec-Zone.ru › Elixir 1.9

Supervisor.Spec

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

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

Функции в этом модуле устарели и не работают с основанными на модулях спецификациями дочерних элементов, представленными в 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 - если дочерний процесс является надзирателем, это механизм, позволяющий поддереву достаточно времени для завершения; он также может использоваться с исполнителями с осторожностью

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

Краткое описание

Типы

child_id()

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

modules()

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

restart()

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

shutdown()

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

spec()

Спецификация надзирателя

strategy()

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

worker()

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

Функции

supervise(children, options)

Получает список 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()}

Получает список children (исполнителей или надзирателей) для наблюдения и набор options.

Возвращает кортеж, содержащий спецификацию надзирателя. Этот кортеж можно использовать в качестве значения возврата 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(module, [], 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.9.4/Supervisor.Spec.html

Spec-Zone.ru

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