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