Spec-Zone.ru › Elixir 1.5

Task.Supervisor

Наблюдатель за задачами.

Этот модуль определяет наблюдателя, который может использоваться для динамического наблюдения за задачами.

start_link/1 может использоваться для запуска наблюдателя. Смотрите модуль Task для получения дополнительных примеров.

Регистрация имени

Наблюдатель Task.Supervisor привязан к тем же правилам регистрации имени, что и GenServer. Подробнее об этом читайте в документации GenServer.

Обзор

Типы

option()

Значения параметров, используемые в start_link

Функции

async(supervisor, fun)

Запускает задачу, на которой можно ожидать завершения

async(supervisor, module, fun, args)

Запускает задачу, на которой можно ожидать завершения

async_nolink(supervisor, fun)

Запускает задачу, на которой можно ожидать завершения

async_nolink(supervisor, module, fun, args)

Запускает задачу, на которой можно ожидать завершения

async_stream(supervisor, enumerable, fun, options \\ [])

Возвращает поток, который выполняет заданную функцию fun асинхронно на каждом элементе в enumerable

async_stream(supervisor, enumerable, module, function, args, options \\ [])

Возвращает поток, который выполняет заданную module, function, и args асинхронно на каждом элементе в enumerable

async_stream_nolink(supervisor, enumerable, fun, options \\ [])

Возвращает поток, который выполняет заданную function асинхронно на каждом элементе в enumerable

async_stream_nolink(supervisor, enumerable, module, function, args, options \\ [])

Возвращает поток, который выполняет заданную module, function, и args асинхронно на каждом элементе в enumerable

children(supervisor)

Возвращает все идентификаторы потомков

start_child(supervisor, fun)

Запускает задачу как потомка данного supervisor

start_child(supervisor, module, fun, args)

Запускает задачу как потомка данного supervisor

start_link(opts \\ [])

Запускает нового наблюдателя

terminate_child(supervisor, pid)

Завершает потомка с указанным pid

Типы

option()

option() ::
  Supervisor.option() |
  {:restart, :supervisor.restart()} |
  {:shutdown, :supervisor.shutdown()}

Значения параметров, используемые в start_link

Функции

async(supervisor, fun)

async(Supervisor.supervisor(), (() -> any())) :: Task.t()

Запускает задачу, на которой можно ожидать завершения.

supervisor должен быть ссылкой, как определено в Task.Supervisor. Задача всё ещё будет связана с вызывающей стороной, см. Task.async/3 для получения дополнительной информации и async_nolink/2 для варианта без связи.

Обратите внимание, что для работы этой функции наблюдателю задач требуется параметр :temporary в качестве опции :restart (по умолчанию), так как async/2 сохраняет прямую ссылку на задачу, которая теряется, если задача перезапускается.

async(supervisor, module, fun, args)

async(Supervisor.supervisor(), module(), atom(), [term()]) :: Task.t()

Запускает задачу, на которой можно ожидать завершения.

supervisor должен быть ссылкой, как определено в Task.Supervisor. Задача всё ещё будет связана с вызывающей стороной, см. Task.async/3 для получения дополнительной информации и async_nolink/2 для варианта без связи.

Обратите внимание, что для работы этой функции наблюдателю задач требуется параметр :temporary в качестве опции :restart (по умолчанию), так как async/4 сохраняет прямую ссылку на задачу, которая теряется, если задача перезапускается.

async_nolink(supervisor, fun)

async_nolink(Supervisor.supervisor(), (() -> any())) :: Task.t()

Запускает задачу, на которой можно ожидать завершения.

supervisor должен быть ссылкой, как определено в Task.Supervisor. Задача не будет связана с вызывающей стороной, см. Task.async/3 для получения дополнительной информации.

Обратите внимание, что для работы этой функции наблюдателю задач требуется параметр :temporary в качестве опции :restart (по умолчанию), так как async_nolink/2 сохраняет прямую ссылку на задачу, которая теряется, если задача перезапускается.

Совместимость с поведением OTP

Если вы создаёте задачу с помощью async_nolink внутри поведения OTP, такого как GenServer, вы должны обрабатывать сообщение из задачи внутри вашего обратного вызова GenServer.handle_info/2.

Ответ, отправленный задачей, будет в формате {ref, result}, где ref — ссылка на монитор, хранящаяся в структуре задачи, а result — возвращаемое значение функции задачи.

Помните, что независимо от того, как завершается задача, созданная с помощью async_nolink, вызывающий процесс всегда получит сообщение :DOWN с тем же значением ref, которое хранится в структуре задачи. Если задача завершается нормально, причина в сообщении :DOWN будет :normal.

async_nolink(supervisor, module, fun, args)

async_nolink(Supervisor.supervisor(), module(), atom(), [term()]) :: Task.t()

Запускает задачу, на которой можно ожидать завершения.

supervisor должен быть ссылкой, как определено в Task.Supervisor. Задача не будет связана с вызывающей стороной, см. Task.async/3 для получения дополнительной информации.

Обратите внимание, что для работы этой функции наблюдателю задач требуется параметр :temporary в качестве опции :restart (по умолчанию), так как async_nolink/4 сохраняет прямую ссылку на задачу, которая теряется, если задача перезапускается.

async_stream(supervisor, enumerable, fun, options \\ [])

async_stream(Supervisor.supervisor(), Enumerable.t(), (term() -> term()), keyword()) :: Enumerable.t()

Возвращает поток, который выполняет заданную функцию fun асинхронно на каждом элементе в enumerable.

Каждый элемент в enumerable передаётся в качестве аргумента заданной функции fun и обрабатывается своей собственной задачей. Задачи будут запущены под данным supervisor и связаны с текущим процессом, аналогично async/2.

См. async_stream/6 для обсуждения, опций и примеров.

async_stream(supervisor, enumerable, module, function, args, options \\ [])

async_stream(Supervisor.supervisor(), Enumerable.t(), module(), atom(), [term()], keyword()) :: Enumerable.t()

Возвращает поток, который выполняет заданные module, function, и args асинхронно на каждом элементе в enumerable.

Каждый элемент будет предваряться заданным args и обрабатываться своей собственной задачей. Задачи будут запущены под данным supervisor и связаны с текущим процессом, аналогично async/4.

При потоковой передаче каждая задача будет генерировать {:ok, value} при успешном завершении или {:exit, reason} если вызывающий процесс ловит исключения. Результаты генерируются в том же порядке, что и исходный enumerable.

Уровень параллелизма можно контролировать с помощью опции :max_concurrency и по умолчанию он равен System.schedulers_online/0. В качестве опции также может быть указан таймаут, представляющий максимальное время ожидания ответа задачи.

Обратите внимание, что для работы этой функции наблюдателю задач требуется параметр :temporary в качестве опции :restart (по умолчанию), так как async_stream/6 сохраняет прямую ссылку на задачу, которая теряется, если задача перезапускается.

И наконец, если вы ловите исключения для обработки исключений внутри асинхронного потока, рассмотрите использование async_stream_nolink/6 для запуска задач, которые не связаны с текущим процессом.

Опции

  • :max_concurrency - устанавливает максимальное количество задач, которые могут выполняться одновременно. По умолчанию равно System.schedulers_online/0.
  • :ordered - определяет, должны ли результаты возвращаться в том же порядке, что и входной поток. Эта опция полезна при работе с большими потоками и не требует буферизации результатов до их доставки. По умолчанию true.
  • :timeout - максимальное время ожидания (в миллисекундах) без получения ответа от задачи (по всем работающим задачам). По умолчанию 5000.
  • :on_timeout - действие при истечении времени ожидания задачи. Возможные значения:

    • :exit (по умолчанию) - процесс, запустивший задачи, завершается.
    • :kill_task - задача, которая превысила лимит времени, убивается. Выводимое значение для этой задачи — {:exit, :timeout}.

Примеры

Давайте создадим поток и затем перечислим его:

stream = Task.Supervisor.async_stream(MySupervisor, collection, Mod, :expensive_fun, [])
Enum.to_list(stream)

async_stream_nolink(supervisor, enumerable, fun, options \\ [])

async_stream_nolink(Supervisor.supervisor(), Enumerable.t(), (term() -> term()), keyword()) :: Enumerable.t()

Возвращает поток, который выполняет заданную функцию function асинхронно на каждом элементе в enumerable.

Каждый элемент в enumerable передаётся в качестве аргумента заданной функции fun и обрабатывается своей собственной задачей. Задачи будут запущены под данным supervisor и не связаны с текущим процессом, аналогично async_nolink/2.

См. async_stream/6 для обсуждения и примеров.

async_stream_nolink(supervisor, enumerable, module, function, args, options \\ [])

async_stream_nolink(Supervisor.supervisor(), Enumerable.t(), module(), atom(), [term()], keyword()) :: Enumerable.t()

Возвращает поток, который выполняет указанную module, function, и args одновременно для каждого элемента в enumerable.

Каждый элемент в enumerable будет добавлен в начало заданного args и обработан своей задачей. Задачи будут запущены под данным supervisor и не будут связаны с текущим процессом, аналогично async_nolink/4.

См. async_stream/6 для обсуждения, опций и примеров.

children(supervisor)

children(Supervisor.supervisor()) :: [pid()]

Возвращает все идентификаторы процессов дочерних задач.

start_child(supervisor, fun)

start_child(Supervisor.supervisor(), (() -> any())) :: {:ok, pid()}

Запускает задачу как дочернюю задачу для данного supervisor.

Обратите внимание, что запущенный процесс не связан с вызывающим, а только с супервайзером. Эта команда полезна в случае, если задаче необходимо выполнить побочные эффекты (например, ввод-вывод) и не требуется отчитываться вызывающей стороне.

start_child(supervisor, module, fun, args)

start_child(Supervisor.supervisor(), module(), atom(), [term()]) :: {:ok, pid()}

Запускает задачу как дочернюю задачу для данного supervisor.

Аналогично start_child/2, за исключением того, что задача задаётся с помощью указанного module, fun и args.

start_link(opts \\ [])

start_link([option()]) :: Supervisor.on_start()

Запускает нового супервайзера.

Поддерживаемые опции:

  • :name - используется для регистрации имени супервайзера, поддерживаемые значения описаны в разделе Name Registration в документации модуля GenServer;

  • :restart - стратегия перезапуска, может быть :temporary (по умолчанию), :transient или :permanent. :temporary означает, что задача никогда не перезапускается, :transient означает, что она перезапускается, если выход не :normal, :shutdown или {:shutdown, reason}. Стратегия перезапуска :permanent означает, что она всегда перезапускается. По умолчанию установлено значение :temporary, поэтому задачи не перезапускаются автоматически при завершении или при сбоях. Обратите внимание, что функции :async в этом модуле поддерживают только перезапуск :temporary;

  • :shutdown - :brutal_kill если задачи должны быть убиты непосредственно при завершении работы, или целое число, указывающее время ожидания, по умолчанию 5000 миллисекунд;

  • :max_restarts и :max_seconds - как указано в Supervisor;

terminate_child(supervisor, pid)

terminate_child(Supervisor.supervisor(), pid()) :: :ok

Прерывает дочернюю задачу с заданным pid.

© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.5.3/Task.Supervisor.html

Spec-Zone.ru

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