Источник 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 автоматически делает это. Определение супервайзера на основе модуля может быть полезно, например, для выполнения задач инициализации в обратном вызове Supervisor.init/1.
Параметры супервайзера и рабочих процессов
В примере выше мы определили спецификации для рабочих процессов и супервайзеров. Эти спецификации (как для рабочих процессов, так и для супервайзеров) принимают следующие параметры:
:id— имя, используемое для идентификации спецификации дочернего процесса внутри супервайзера; по умолчанию соответствует имени модуля дочернего рабочего процесса/супервайзера:function— функция для вызова в дочернем процессе для его запуска:restart— атом, определяющий, когда завершенный дочерний процесс должен быть перезапущен (см. раздел «Значения перезапуска» ниже):shutdown— атом, определяющий, как дочерний процесс должен завершаться (см. раздел «Значения завершения» ниже):modules— должен быть списком с одним элементом[module], где module — имя модуля обратного вызова только в том случае, если дочерний процесс являетсяSupervisorилиGenServer; если дочерний процесс являетсяGenEvent,:modulesдолжен быть:dynamic
Значения перезапуска (:restart)
Следующие значения перезапуска поддерживаются в параметре %%%CODE_BLOCK_18%%:
:permanent— дочерний процесс всегда перезапускается:temporary— дочерний процесс никогда не перезапускается (даже когда стратегия супервайзера равна:rest_for_oneили:one_for_all):transient— дочерний процесс перезапускается только в случае его аварийного завершения, то есть с причиной выхода отличной от:normal,:shutdownили{:shutdown, term}
Обратите внимание, что супервайзер, достигший максимальной интенсивности перезапуска, завершится с причиной :shutdown. В этом случае супервайзер будет перезапущен только в том случае, если его спецификация дочернего процесса была определена с параметром :restart, установленным в :permanent (по умолчанию).
Значения завершения (:shutdown)
Следующие значения завершения поддерживаются в параметре %%%CODE_BLOCK_31%%:
: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()Источник
@type child_id() :: term()
Поддерживаемые значения идентификаторов
modules()Источник
@type modules() :: :dynamic | [module()]
Поддерживаемые значения модулей
restart()Источник
@type restart() :: :permanent | :transient | :temporary
Поддерживаемые значения перезапуска
shutdown()Источник
@type shutdown() :: timeout() | :brutal_kill
Поддерживаемые значения завершения
spec()Источник
@type spec() ::
{child_id(), start_fun :: {module(), atom(), [term()]}, restart(), shutdown(),
worker(), modules()} Спецификация супервайзера
strategy()Источник
@type strategy() :: :simple_one_for_one | :one_for_one | :one_for_all | :rest_for_one
Поддерживаемые стратегии
worker()Источник
@type worker() :: :worker | :supervisor
Поддерживаемые значения рабочих процессов
Функции
supervise(children, options)Source
@spec supervise([spec()],
strategy: strategy(),
max_restarts: non_neg_integer(),
max_seconds: pos_integer()
) :: {:ok, tuple()} Принимает список children (рабочих процессов или супервизоров) для наблюдения и набор options.
Возвращает кортеж, содержащий спецификацию супервизора. Этот кортеж может использоваться в качестве возвращаемого значения обратного вызова Supervisor.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 \\ [])Source
@spec 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 \\ [])Source
@spec 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-2024 The Elixir Team
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.16.3/Supervisor.Spec.html