Процесс
Удобства работы с процессами и словарем процессов.
Помимо функций, доступных в этом модуле, модуль 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, name)
-
Связывает атом
nameс идентификатором процесса или порта - registered()
-
Возвращает список имён, зарегистрированных с помощью
register/2 - send(dest, msg, options)
-
Отправляет сообщение заданному процессу
- send_after(dest, msg, time)
-
Отправляет
msgпроцессуdestчерезtimeмиллисекунд - sleep(timeout)
-
Приостанавливает текущий процесс на
timeout - spawn(fun, opts)
-
Запускает заданную функцию в соответствии с заданными параметрами
- spawn(mod, fun, args, opts)
-
Запускает заданную функцию из модуля
mod, передавая заданныеargsв соответствии с заданными параметрами - unlink(pid)
-
Удаляет связь (если она существует) между вызывающим процессом и процессом или портом, на который указывает
pid. Возвращаетtrueи не вызывает ошибки, даже если связи нет илиidне существует - unregister(name)
-
Удаляет зарегистрированное
name, связанное с идентификатором процесса или порта - 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не завершится (если это не идентификатор процесса вызывающего процесса, в этом случае он завершится по причине: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
Возвращает идентификатор процесса лидера группы для процесса, который оценивает функцию.
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, name)
register(pid | port, atom) :: true
Связывает атом name с pid или идентификатором порта.
name, затем может использоваться вместо pid / идентификатора порта с функцией Kernel.send/2. Process.register/2 завершится ошибкой ArgumentError, если предоставленный pid больше не жив (проверьте с помощью alive?/1) или если имя уже зарегистрировано (проверьте с помощью whereis/1) или если pid уже зарегистрирован для другого name.
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)
send_after(pid | atom, term, non_neg_integer) :: reference
Отправляет msg в dest после time миллисекунд.
Если dest является идентификатором процесса, то это должен быть идентификатор локального процесса, мертвого или живого. Если dest является атомом, то это должно быть имя зарегистрированного процесса, которое находится в поиске во время доставки. Ошибка не выдаётся, если имя не относится к процессу.
Эта функция возвращает ссылку на таймер, который может быть прочитан или отменён с помощью read_timer/1 и cancel_timer/1.
Наконец, таймер будет автоматически отменён, если заданный dest является идентификатором процесса, который не активен или когда указанный pid выходит. Обратите внимание, что таймеры не будут автоматически отменены, когда dest является атомом (так как разрешение атома выполняется при доставке).
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 в примере выше.
Аналогично, если вы ждёте завершения процесса, используйте мониторинг вместо 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 или порта.
См. :erlang.unregister/1 для получения дополнительной информации.
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.3.4/Process.html