Spec-Zone.ru › Elixir 1.4

Процесс

Удобства для работы с процессами и словарем процессов.

Помимо функций, доступных в этом модуле, модуль Kernel предоставляет и автоматически импортирует некоторые основные функции, связанные с процессами, доступные через функции:

  • Kernel.spawn/1 и Kernel.spawn/3
  • Kernel.spawn_link/1 и Kernel.spawn_link/3
  • Kernel.spawn_monitor/1 и Kernel.spawn_monitor/3
  • Kernel.self/0
  • Kernel.send/2

Обзор

Типы

spawn_opt()
spawn_opts()

Функции

alive?(pid)

Возвращает true, если процесс существует и активен (т.е. он не завершается и еще не завершился). В противном случае возвращает false

cancel_timer(timer_ref)

Отменяет таймер, созданный с помощью send_after/3

delete(key)

Удаляет заданный key из словаря процессов

demonitor(monitor_ref, options \\ [])

Если monitor_ref — ссылка, полученная вызывающим процессом с помощью вызова monitor/1, то мониторинг отключается. Если мониторинг уже отключен, ничего не происходит.

exit(pid, reason)

Отправляет сигнал завершения с заданным reason процессу pid

flag(flag, value)

Устанавливает определенные флаги для процесса, вызвавшего эту функцию. Возвращает старое значение flag

flag(pid, flag, value)

Устанавливает определенные флаги для процесса pid таким же образом, как и flag/2. Возвращает старое значение flag. Разрешенные значения для flag — только подмножество значений, разрешенных в flag/2, а именно :save_calls

get()

Возвращает все пары ключ-значение в словаре процессов

get(key, default \\ nil)

Возвращает значение для заданного key или default, если key не задано

get_keys()

Возвращает все ключи в словаре процессов

get_keys(value)

Возвращает все ключи, которые имеют заданное value

group_leader()

Возвращает идентификатор процесса (PID) лидера группы для процесса, который оценивает функцию

group_leader(pid, leader)

Устанавливает лидера группы процесса pid в leader. Обычно это используется, когда процессы, запущенные из определенной оболочки, должны иметь лидера группы, отличного от :init

hibernate(mod, fun, args)

Переводит вызывающий процесс в состояние ожидания, где его выделение памяти уменьшено по возможности, что полезно, если процесс не ожидает получения сообщений в ближайшем будущем

info(pid)

Возвращает информацию о процессе, идентифицированном по pid, или возвращает nil, если процесс не активен. Используйте только для отладки.

info(pid, spec)

Возвращает информацию о процессе, идентифицированном по pid, или возвращает nil, если процесс не активен.

link(pid)

Создаёт связь между вызывающим процессом и другим процессом (или портом) pid, если такой связи ещё нет.

list()

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

monitor(item)

Вызывающий процесс начинает мониторинг заданного item. Он возвращает ссылку на монитор.

put(key, value)

Записывает заданную пару key-value в словарь процессов.

read_timer(timer_ref)

Читает таймер, созданный с помощью send_after/3.

register(pid_or_port, name)

Регистрирует заданный pid_or_port под заданным name

registered()

Возвращает список имён, зарегистрированных с помощью register/2.

send(dest, msg, options)

Отправляет сообщение заданному процессу.

send_after(dest, msg, time, opts \\ [])

Отправляет msg процессу dest через time миллисекунд.

sleep(timeout)

Приостанавливает текущий процесс на timeout

spawn(fun, opts)

Запускает заданную функцию в соответствии с заданными параметрами.

spawn(mod, fun, args, opts)

Запускает заданную функцию из модуля mod, передавая заданные args в соответствии с заданными параметрами.

unlink(pid)

Удаляет связь, если она существует, между вызывающим процессом и процессом или портом, указанным по pid. Возвращает true и не вызывает ошибку, даже если связи нет или id не существует.

unregister(name)

Удаляет зарегистрированное name, связанное с идентификатором PID или порта.

whereis(name)

Возвращает идентификатор PID или порта с зарегистрированным name. Возвращает nil, если имя не зарегистрировано.

Типы

spawn_opt()

spawn_opt() ::
  :link |
  :monitor |
  {:priority, :low | :normal | :high} |
  {:fullsweep_after, non_neg_integer()} |
  {:min_heap_size, non_neg_integer()} |
  {:min_bin_vheap_size, non_neg_integer()}

spawn_opts()

spawn_opts() :: [spawn_opt()]

Функции

alive?(pid)

alive?(pid()) :: boolean()

Возвращает true, если процесс существует и активен (т. е. он не завершается и еще не завершился). В противном случае возвращает false.

pid должен ссылаться на процесс на локальном узле.

Встроено компилятором.

cancel_timer(timer_ref)

cancel_timer(reference()) :: non_neg_integer() | false

Отменяет таймер, созданный с помощью send_after/3.

Если результат — целое число, оно представляет время в миллисекундах, оставшееся до истечения таймера.

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

Если таймер истек, сообщение о таймауте отправлено, но это не говорит о том, достигло ли оно назначения.

Встроено компилятором.

delete(key)

delete(term()) :: term() | nil

Удаляет заданный key из словаря процессов.

demonitor(monitor_ref, options \\ [])

demonitor(reference(), options :: [:flush | :info]) :: boolean()

Если monitor_ref — ссылка, полученная вызывающим процессом с помощью вызова monitor/1, то мониторинг отключается. Если мониторинг уже отключен, ничего не происходит.

См. :erlang.demonitor/2 для получения дополнительной информации.

Встроено компилятором.

exit(pid, reason)

exit(pid(), term()) :: true

Отправляет сигнал завершения с заданным reason процессу pid.

Следующее поведение применяется, если reason — любой термин, кроме :normal или :kill:

  1. Если pid не ловит завершения, pid завершится с заданным reason.

  2. Если pid ловит завершения, сигнал завершения преобразуется в сообщение {:EXIT, from, reason} и передаётся в очередь сообщений процесса pid.

Если reason является атомом :normal, то pid не выйдет (если только pid не является вызывающим процессом, в этом случае он выйдет с причиной :normal). Если он перехватывает выходы, то сигнал выхода преобразуется в сообщение {:EXIT, from, :normal} и доставляется в его очередь сообщений.

Если reason является атомом :kill, то есть если exit(pid, :kill) вызывается, сигнал неуловимого выхода отправляется в pid, который безусловно выйдет с причиной :killed.

Встроенно компилятором.

Примеры

Process.exit(pid, :kill)

flag(flag, value)

flag(process_flag(), term()) :: term()

Устанавливает определённые флаги для процесса, который вызывает эту функцию. Возвращает старое значение flag.

См. :erlang.process_flag/2 для получения более подробной информации.

flag(pid, flag, value)

flag(pid(), :save_calls, non_neg_integer()) :: non_neg_integer()

Устанавливает определённые флаги для процесса pid аналогично flag/2. Возвращает старое значение flag. Допустимые значения для flag являются только подмножеством значений, разрешенных в flag/2, а именно :save_calls.

См. :erlang.process_flag/3 для получения более подробной информации.

get()

get() :: [{term(), term()}]

Возвращает все пары ключ-значение в словаре процесса.

Встроенно компилятором.

get(key, default \\ nil)

get(term(), default :: term()) :: term()

Возвращает значение для данного key или default, если key не задано.

get_keys()

get_keys() :: [term()]

Возвращает все ключи в словаре процесса.

Встроенно компилятором.

get_keys(value)

get_keys(term()) :: [term()]

Возвращает все ключи, которые имеют данное value.

Встроенно компилятором.

group_leader()

group_leader() :: pid()

Возвращает PID лидера группы для процесса, который вычисляет функцию.

group_leader(pid, leader)

group_leader(pid(), leader :: pid()) :: true

Устанавливает лидера группы для pid в leader. Обычно это используется, когда процессы, запущенные из определённой оболочки, должны иметь лидера группы, отличного от :init.

hibernate(mod, fun, args)

hibernate(module(), atom(), list()) :: no_return()

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

См. :erlang.hibernate/3 для получения более подробной информации.

Встроенно компилятором.

info(pid)

info(pid()) :: Keyword.t()

Возвращает информацию о процессе, идентифицированном по pid, или возвращает nil, если процесс не активен. Используйте это только для отладки.

См. :erlang.process_info/1 для получения более подробной информации.

info(pid, spec)

info(pid(), atom() | [atom()]) ::
  {atom(), term()} |
  [{atom(), term()}] |
  nil

Возвращает информацию о процессе, идентифицированном по pid, или возвращает nil, если процесс не активен.

См. :erlang.process_info/2 для получения более подробной информации.

link(pid)

link(pid() | port()) :: true

Создаёт связь между вызывающим процессом и другим процессом (или портом) pid, если такой связи ещё нет.

См. :erlang.link/1 для получения более подробной информации.

Встроенно компилятором.

list()

list() :: [pid()]

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

Обратите внимание, что процесс, который завершается, существует, но не активен, т. е. alive?/1 вернёт false для процесса, который завершается, но его идентификатор процесса будет частью возвращаемого результата.

См. :erlang.processes/0 для получения более подробной информации.

monitor(item)

monitor(pid() | {reg_name :: atom(), node :: atom()} | reg_name() :: atom()) :: reference()

Вызывающий процесс начинает мониторинг заданного item. Возвращает ссылку на монитор.

См. нужда в мониторинге для примера. См. :erlang.monitor/2 для получения более подробной информации.

Встроенно компилятором.

put(key, value)

put(term(), term()) :: term() | nil

Хранит заданную пару key-value в словаре процесса.

Возвращаемое значение — это значение, которое ранее хранилось по ключу key (или nil в случае, если по ключу key не было значения).

read_timer(timer_ref)

read_timer(reference()) :: non_neg_integer() | false

Читает таймер, созданный с помощью send_after/3.

Если результат — целое число, то оно представляет собой время в миллисекундах, оставшееся до истечения таймера.

Если результат — false, то таймер, соответствующий timer_ref, не был найден. Это может быть из-за того, что таймер истек, уже был отменён или потому что timer_ref никогда не соответствовал таймеру.

Если таймер истек, сообщение о тайм-ауте было отправлено, но это не говорит вам, достигло ли оно адресата или нет.

Встроенно компилятором.

register(pid_or_port, name)

register(pid() | port(), atom()) :: true

Регистрирует данный pid_or_port под данным name.

name должен быть атомом и затем может быть использован вместо идентификатора PID/порта при отправке сообщений с помощью Kernel.send/2.

register/2 завершится ошибкой ArgumentError, если PID/порт не существует локально и жив, если имя уже зарегистрировано или если pid_or_port уже зарегистрирован для другого name.

Следующие имена зарезервированы и не могут быть назначены процессам или портам: nil, false, true или :undefined.

registered()

registered() :: [atom()]

Возвращает список имён, которые были зарегистрированы с помощью register/2.

send(dest, msg, options)

send(dest, msg, [option]) ::
  :ok |
  :noconnect |
  :nosuspend when dest: pid() | port() | atom() | {atom(), node()}, msg: any(), option: :noconnect | :nosuspend

Отправляет сообщение данному процессу.

Если используется опция :noconnect, и отправка сообщения потребует автоматического подключения к другому узлу, сообщение не отправляется и возвращается :noconnect.

Если используется опция :nosuspend, и отправка сообщения приведёт к приостановке отправителя, сообщение не отправляется и возвращается :nosuspend.

В противном случае сообщение отправляется и возвращается :ok.

Примеры

iex> Process.send({:name, :node_does_not_exist}, :hi, [:noconnect])
:noconnect

send_after(dest, msg, time, opts \\ [])

send_after(pid() | atom(), term(), non_neg_integer(), [option]) :: reference() when option: {:abs, boolean()}

Отправляет msg в dest через time миллисекунд.

Если dest — PID, то это PID локального процесса, живого или нет. Если dest — атом, то это имя зарегистрированного процесса, которое ищется во время доставки. Ошибка не возникает, если имя не ссылается на процесс.

Эта функция возвращает ссылку на таймер, который можно прочитать или отменить с помощью read_timer/1 и cancel_timer/1.

Наконец, таймер будет автоматически отменён, если заданный dest — PID, который не жив, или когда заданный PID завершает работу. Обратите внимание, что таймеры не будут автоматически отменены, когда dest — атом (поскольку разрешение атома происходит при доставке).

Опции

  • :abs - (булево) если false, time обрабатывается как относительное к текущему монотонному времени. Если true, то time является абсолютным значением эрлангового монотонного времени, в котором msg должен быть передан dest. Чтобы узнать больше об эрланговом монотонном времени и других связанных с временем понятиях, см. документацию модуля System. По умолчанию false.

sleep(timeout)

Засыпает текущий процесс на timeout.

timeout — это либо количество миллисекунд сна как целое число, либо атом :infinity. Когда задан :infinity, текущий процесс приостановится навсегда.

Используйте эту функцию с большой осторожностью. Почти во всех ситуациях, когда вы бы использовали sleep/1 в Elixir, скорее всего, есть более правильный, быстрый и точный способ достижения этого с помощью обмена сообщениями.

Например, если вы ждёте, чтобы процесс выполнил какое-то действие, лучше общаться.

Другими словами, не делайте:

Task.start_link fn ->
  do_something()
  ...
end

# Wait until work is done
Process.sleep(2000)

Но делайте:

parent = self()
Task.start_link fn ->
  do_something()
  send parent, :work_is_done
  ...
end

receive do
  :work_is_done -> :ok
after
  30_000 -> :timeout # Optional timeout
end

Или даже используйте Task.async/1 и Task.await/2 в приведённом выше примере.

Аналогично, если вы ждёте завершения процесса, используйте monitor вместо sleep. Не нужно:

Task.start_link fn ->
  ...
end

# Wait until task terminates
Process.sleep(2000)

Вместо этого нужно:

{:ok, pid} =
  Task.start_link fn ->
    ...
  end

ref = Process.monitor(pid)
receive do
  {:DOWN, ^ref, _, _, _} -> :task_is_down
after
  30_000 -> :timeout # Optional timeout
end

spawn(fun, opts)

spawn((() -> any()), spawn_opts()) :: pid() | {pid(), reference()}

Запускает заданную функцию в соответствии с заданными параметрами.

Результат зависит от заданных параметров. В частности, если :monitor задан в качестве параметра, будет возвращена кортеж, содержащий PID и ссылку на отслеживание, иначе только PID запущенного процесса.

Также принимаются дополнительные параметры. Список доступных параметров см. в :erlang.spawn_opt/4.

Встраивается компилятором.

spawn(mod, fun, args, opts)

spawn(module(), atom(), list(), spawn_opts()) ::
  pid() |
  {pid(), reference()}

Запускает заданную функцию из модуля mod, передавая заданные args в соответствии с заданными параметрами.

Результат зависит от заданных параметров. В частности, если :monitor задан в качестве параметра, будет возвращена кортеж, содержащий PID и ссылку на отслеживание, иначе только PID запущенного процесса.

Также принимаются дополнительные параметры. Список доступных параметров см. в :erlang.spawn_opt/4.

Встраивается компилятором.

unlink(pid)

unlink(pid() | port()) :: true

Удаляет связь, если она существует, между вызывающим процессом и процессом или портом, на который указывает pid. Возвращает true и не завершается с ошибкой даже если связи нет или id не существует.

Дополнительную информацию см. в :erlang.unlink/1.

Встраивается компилятором.

unregister(name)

unregister(atom()) :: true

Удаляет зарегистрированное name, связанное с PID или идентификатором порта.

Возвращает ошибку ArgumentError, если имя не зарегистрировано ни для какого PID или порта.

whereis(name)

whereis(atom()) :: pid() | port() | nil

Возвращает PID или идентификатор порта с зарегистрированным name. Возвращает nil, если имя не зарегистрировано.

Дополнительную информацию см. в :erlang.whereis/1.

© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.4.5/Process.html

Spec-Zone.ru

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