Spec-Zone.ru › Elixir 1.10

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], где 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()

Поддерживаемые значения 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()

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

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)

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

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

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

Spec-Zone.ru

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