Spec-Zone.ru › Elixir 1.3

Процесс

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

Помимо функций, доступных в этом модуле, модуль 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:

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

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

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

  4. Если 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

Spec-Zone.ru

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