Процесс
Удобства для работы с процессами и словарем процессов.
Помимо функций, доступных в этом модуле, модуль 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:
-
Если
pidне ловит завершения,pidзавершится с заданнымreason. -
Если
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