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