Исходный код Процесс
Удобные инструменты для работы с процессами и словарем процессов.
Помимо функций, доступных в этом модуле, модуль 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/0Kernel.send/2
Хотя этот модуль предоставляет удобные инструменты низкого уровня для работы с процессами, разработчики обычно используют абстракции, такие как Agent, GenServer, Registry, Supervisor и Task для построения своих систем и обращаются к этому модулю для получения информации, отслеживания завершений, связей и мониторинга.
Псевдонимы
Псевдонимы — это функция, представленная в Erlang/OTP 24. Псевдоним — это способ обращения к PID для отправки сообщений. Преимущество использования псевдонимов заключается в том, что их можно деактивировать, даже если связанный с ними процесс всё ещё работает. Если вы отправляете сообщение на деактивированный псевдоним, ничего не произойдёт. Это упрощает реализацию сценариев запроса/ответа.
Вы можете использовать alias/0 или alias/1 для задания псевдонима, а затем отправлять сообщения на этот псевдоним так же, как вы делаете с PID с помощью send/2. Для деактивации псевдонима можно использовать unalias/1. Если вы отправляете сообщение на деактивированный псевдоним, ничего не произойдёт.
Например, вы могли бы иметь процесс, который слушает :ping сообщения:
def server do
receive do
{:ping, source_alias} ->
send(source_alias, :pong)
server()
end
end
Теперь другой процесс может отправить запрос на этот процесс:
server = spawn(&server/0)
source_alias = Process.alias()
send(server, {:ping, source_alias})
receive do
:pong -> :pong
end
#=> :pong
Если теперь вы деактивируете source_alias и снова отправите запрос на сервер, вы не получите никакого ответа, так как сервер send/2 :pong ответ на деактивированный псевдоним.
Process.unalias(source_alias)
send(server, {:ping, source_alias})
receive do
:pong -> :pong
after
1000 -> :timeout
end
#=> :timeout
См. также раздел «Псевдонимы процессов» в Справочном руководстве по Erlang.
Краткое описание
Типы
- dest()
Назначение процесса.
Функции
- alias()
Создаёт псевдоним процесса.
- alias(options)
Создаёт псевдоним процесса.
- alive?(pid)
Определяет, жив ли данный процесс на локальном узле.
- cancel_timer(timer_ref, options \\ [])
Отменяет таймер, возвращённый функцией
send_after/3.- delete(key)
Удаляет заданный
keyиз словаря процесса.- demonitor(monitor_ref, options \\ [])
Отслеживает монитор, идентифицируемый указанным
reference.- exit(pid, reason)
Отправляет сигнал завершения с указанным
reasonпроцессуpid.- flag(flag, value)
Устанавливает заданный
flagв значениеvalueдля вызывающего процесса.- flag(pid, flag, value)
Устанавливает заданный
flagв значениеvalueдля указанного процессаpid.- get()
Возвращает все пары ключ-значение в словаре процесса.
- get(key, default \\ nil)
Возвращает значение для заданного
keyв словаре процесса илиdefault, еслиkeyне задано.- get_keys()
Возвращает все ключи в словаре процесса.
- get_keys(value)
Возвращает все ключи в словаре процесса, у которых есть заданное
value.- group_leader()
Возвращает PID лидера группы для вызывающего процесса.
- group_leader(pid, leader)
Устанавливает лидера группы для указанного
pidвleader.- hibernate(mod, fun_name, args)
Переводит вызывающий процесс в состояние «спячки».
- info(pid)
Возвращает информацию о процессе, идентифицированном
pid, илиnil, если процесс не активен.- info(pid, spec)
Возвращает информацию о процессе, идентифицированном
pid, илиnil, если процесс не активен.- link(pid_or_port)
Создаёт ссылку между вызывающим процессом и заданным элементом (процессом или портом).
- list()
Возвращает список PID, соответствующих всем процессам, которые в данный момент существуют на локальном узле.
- monitor(item)
Начинает отслеживание заданного
itemиз вызывающего процесса.- monitor(item, options)
Начинает отслеживание заданного
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)
Отправляет сообщение заданному
dest.- send_after(dest, msg, time, opts \\ [])
Отправляет
msgвdestчерезtimeмиллисекунд.- set_label(label)
Добавляет описательное слово текущему процессу.
- sleep(timeout)
Приостанавливает текущий процесс на заданный
timeout.- spawn(fun, opts)
Запускает заданную функцию в соответствии с заданными параметрами.
- spawn(mod, fun, args, opts)
Запускает заданную функцию
funиз модуляmod, передавая указанныеargsв соответствии с заданными параметрами.- unalias(alias)
Явно деактивирует псевдоним процесса.
- unlink(pid_or_port)
Удаляет ссылку между вызывающим процессом и заданным элементом (процессом или портом).
- unregister(name)
Удаляет зарегистрированное
name, связанное с PID или идентификатором порта.- whereis(name)
Возвращает PID или идентификатор порта, зарегистрированные под
name, илиnil, если имя не зарегистрировано.
Типы
alias()Source
@type alias() :: reference()
Псевдоним, возвращаемый функцией alias/0 или alias/1.
См. документацию по модулям для получения дополнительной информации о псевдонимах.
alias_opt()Source
@type alias_opt() :: :explicit_unalias | :reply
dest()Source
@type dest() ::
pid()
| port()
| (registered_name :: atom())
| {registered_name :: atom(), node()} Назначение процесса.
Удаленный или локальный PID, локальный порт, локально зарегистрированное имя или кортеж в формате {registered_name, node} для зарегистрированного имени на другом узле.
process_info_item()Source
@type process_info_item() :: atom() | {:dictionary, term()} process_info_result_item()Source
@type process_info_result_item() :: {process_info_item(), term()} spawn_opt()Source
@type spawn_opt() ::
:link
| :monitor
| {:monitor, :erlang.monitor_option()}
| {:priority, :low | :normal | :high}
| {:fullsweep_after, non_neg_integer()}
| {:min_heap_size, non_neg_integer()}
| {:min_bin_vheap_size, non_neg_integer()}
| {:max_heap_size, heap_size()}
| {:message_queue_data, :off_heap | :on_heap} spawn_opts()Source
@type spawn_opts() :: [spawn_opt()]
Функции
alias()Source
@spec alias() :: alias()
Создаёт псевдоним процесса.
Это то же самое, что вызов alias/1 как alias([:explicit_unalias]). См. также :erlang.alias/0.
Встроенный компилятором.
Примеры
alias = Process.alias()
alias(options)Source
@spec alias([alias_opt()]) :: alias()
Создаёт псевдоним процесса.
См. документацию модуля для получения дополнительной информации о псевдонимах. См. также :erlang.alias/1.
Встроенный компилятором.
Примеры
alias = Process.alias([:reply])
alive?(pid)Source
@spec alive?(pid()) :: boolean()
Определяет, является ли заданный процесс активным на локальном узле.
Если процесс, идентифицированный pid, активен (то есть он не завершается и ещё не завершился), то эта функция возвращает true. В противном случае она возвращает false.
pid должен ссылаться на процесс, работающий на локальном узле, иначе будет выброшено исключение ArgumentError. Чтобы проверить, является ли процесс на любом узле активным, вы можете использовать модуль :erpc.
:erpc.call(node(pid), Process, :alive?, [pid])
Встроенный компилятором.
cancel_timer(timer_ref, options \\ [])Source
@spec cancel_timer(reference(), options) :: non_neg_integer() | false | :ok when options: [async: boolean(), info: boolean()]
Отменяет таймер, возвращённый функцией send_after/3.
Если результатом является целое число, оно представляет собой время в миллисекундах, оставшееся до истечения таймера.
Если результатом является false, таймер, соответствующий timer_ref, не найден. Это может произойти, если таймер истек, был отменён или же timer_ref никогда не соответствовал таймеру.
Даже если таймер истек, а сообщение было отправлено, эта функция не сообщает, прибыло ли сообщение о таймауте по назначению.
Встроенный компилятором.
Параметры
:async- (логическое значение) еслиfalse, запрос на отмену является синхронным. Еслиtrue, запрос на отмену является асинхронным, что означает, что запрос на отмену таймера отправляется, а:okвозвращается сразу. По умолчаниюfalse.:info- (логическое значение) возвращать ли информацию об отмене таймера. Если параметр:asyncравенfalse, и:infoравенtrue, то возвращается целое число илиfalse(как описано выше). Если:asyncравенfalse, и:infoравенfalse, возвращается:ok. Если:asyncравенtrue, и:infoравенtrue, в вызывающую функцию отправляется сообщение в формате{:cancel_timer, timer_ref, result}(гдеresult— целое число илиfalseкак описано выше), когда отмена выполнена. Если:asyncравенtrue, и:infoравенfalse, сообщение не отправляется. По умолчаниюtrue.
delete(key)Source
@spec delete(term()) :: term() | nil
Удаляет заданный key из словаря процесса.
Возвращает значение, которое находилось под key в словаре процесса, или nil , если key не хранилось в словаре процесса.
Примеры
iex> Process.put(:comments, ["comment", "other comment"]) iex> Process.delete(:comments) ["comment", "other comment"] iex> Process.delete(:comments) nil
demonitor(monitor_ref, options \\ [])Source
@spec demonitor(reference(), options :: [:flush | :info]) :: boolean()
Отменяет мониторинг, идентифицируемый заданным reference.
Если monitor_ref — ссылка, полученная вызывающим процессом с помощью вызова monitor/1, этот мониторинг отключается. Если мониторинг уже отключён, ничего не происходит.
См. :erlang.demonitor/2 для получения дополнительной информации.
Встроенный компилятором.
Примеры
pid = spawn(fn -> 1 + 2 end) ref = Process.monitor(pid) Process.demonitor(ref) #=> true
exit(pid, reason)Source
@spec 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, то есть вызывается Process.exit(pid, :kill), непреодолимый сигнал завершения отправляется процессу pid, который безусловно завершит работу с причиной :killed.
Встроенный компилятором.
Примеры
Process.exit(pid, :kill) #=> true
flag(flag, value)Source
@spec flag(:error_handler, module()) :: module()
@spec flag(:max_heap_size, heap_size()) :: heap_size()
@spec flag(:message_queue_data, :off_heap | :on_heap) :: :off_heap | :on_heap
@spec flag(:min_bin_vheap_size, non_neg_integer()) :: non_neg_integer()
@spec flag(:min_heap_size, non_neg_integer()) :: non_neg_integer()
@spec flag(:priority, priority_level()) :: priority_level()
@spec flag(:save_calls, 0..10000) :: 0..10000
@spec flag(:sensitive, boolean()) :: boolean()
@spec flag(:trap_exit, boolean()) :: boolean()
Устанавливает заданный flag в value для вызывающего процесса.
Возвращает старое значение flag.
См. :erlang.process_flag/2 для получения дополнительной информации.
Встроенный компилятором.
flag(pid, flag, value)Source
@spec flag(pid(), :save_calls, 0..10000) :: 0..10000
Устанавливает заданный flag в value для указанного процесса pid.
Возвращает старое значение flag.
Выбрасывает исключение ArgumentError, если pid не является локальным процессом.
Допустимые значения для flag — лишь подмножество значений, разрешённых в flag/2, а именно :save_calls.
См. :erlang.process_flag/3 для получения дополнительной информации.
Встроенный компилятором.
get()Source
@spec get() :: [{term(), term()}] Возвращает все пары ключ-значение в словаре процесса.
Встроенный компилятором.
get(key, default \\ nil)Source
@spec get(term(), default :: term()) :: term()
Возвращает значение для заданного key в словаре процесса, или default , если key не задано.
Примеры
# Assuming :locale was not set iex> Process.get(:locale, "pt") "pt" iex> Process.put(:locale, "fr") nil iex> Process.get(:locale, "pt") "fr"
get_keys()Source
@spec get_keys() :: [term()]
Возвращает все ключи в словаре процесса.
Встроенный компилятором.
Примеры
# Assuming :locale was not set iex> :locale in Process.get_keys() false iex> Process.put(:locale, "pt") nil iex> :locale in Process.get_keys() true
get_keys(value)Source
@spec get_keys(term()) :: [term()]
Возвращает все ключи в словаре процесса, у которых есть заданное value.
Встраивается компилятором.
group_leader()Source
@spec group_leader() :: pid()
Возвращает PID лидера группы для вызывающего процесса.
Встраивается компилятором.
Примеры
Process.group_leader() #=> #PID<0.53.0>
group_leader(pid, leader)Source
@spec group_leader(pid(), leader :: pid()) :: true
Устанавливает лидера группы для данного pid в leader.
Обычно используется, когда процесс, запущенный из определенной оболочки, должен иметь лидера группы, отличного от :init.
Встраивается компилятором.
hibernate(mod, fun_name, args)Source
@spec hibernate(module(), atom(), list()) :: no_return()
Переводит вызывающий процесс в состояние «гибернации».
Вызывающий процесс переводится в состояние ожидания, где выделение памяти было уменьшено максимально возможно, что полезно, если процесс не ожидает получения сообщений в ближайшее время.
См. :erlang.hibernate/3 для получения дополнительной информации.
Встраивается компилятором.
info(pid)Source
@spec info(pid()) :: keyword() | nil
Возвращает информацию о процессе, идентифицированном по pid, или возвращает nil, если процесс не активен.
Используйте только для отладки.
См. :erlang.process_info/1 для получения дополнительной информации.
info(pid, spec)Source
@spec info(pid(), process_info_item()) :: process_info_result_item() | nil
@spec info(pid(), [process_info_item()]) :: [process_info_result_item()] | nil
Возвращает информацию о процессе, идентифицированном по pid, или возвращает nil, если процесс не активен.
См. :erlang.process_info/2 для получения дополнительной информации.
link(pid_or_port)Source
@spec link(pid() | port()) :: true
Создает связь между вызывающим процессом и заданным элементом (процессом или портом).
Связи двунаправленные. Связанные процессы можно разъединить с помощью unlink/1.
Если такая связь уже существует, эта функция ничего не делает, так как между двумя заданными процессами может быть только одно соединение. Если процесс пытается установить связь с самим собой, ничего не произойдёт.
Когда два процесса связаны, каждый из них получает сигналы завершения от другого (см. также exit/2). Предположим, что pid1 и pid2 связаны. Если pid2 завершается по причине, отличной от :normal (которая также является причиной завершения, когда процесс завершает свою работу), и pid1 не обрабатывает завершения (см. flag/2), тогда pid1 завершится с той же причиной, что и pid2 и, в свою очередь, отправит сигнал завершения всем своим другим связанным процессам. Поведение, когда pid1 обрабатывает завершения, описано в exit/2.
См. :erlang.link/1 для получения дополнительной информации.
Встраивается компилятором.
list()Source
@spec list() :: [pid()]
Возвращает список PID, соответствующих всем процессам, которые в настоящее время существуют на локальном узле.
Обратите внимание, что если процесс завершается, он считается существующим, но не активным. Это означает, что для такого процесса alive?/1 вернёт false, но его PID будет частью списка PID, возвращаемого этой функцией.
См. :erlang.processes/0 для получения дополнительной информации.
Встраивается компилятором.
Примеры
Process.list() #=> [#PID<0.0.0>, #PID<0.1.0>, #PID<0.2.0>, #PID<0.3.0>, ...]
monitor(item)Source
@spec monitor(pid() | {name, node()} | name) :: reference() when name: atom() Начинает мониторинг заданного item из вызывающего процесса.
После смерти отслеживаемого процесса сообщение передаётся отслеживающему процессу в формате:
{:DOWN, ref, :process, object, reason}
где:
-
ref— ссылка на монитор, возвращённая этой функцией; -
object— это либоpidотслеживаемого процесса (если отслеживается PID) или{name, node}(если отслеживается удалённое или локальное имя); -
reason— причина завершения.
Если процесс уже мёртв при вызове Process.monitor/1, сообщение :DOWN передаётся немедленно.
См. "Необходимость мониторинга" для примера. См. :erlang.monitor/2 для получения дополнительной информации.
Встраивается компилятором.
Примеры
pid = spawn(fn -> 1 + 2 end)
#=> #PID<0.118.0>
Process.monitor(pid)
#=> #Reference<0.906660723.3006791681.40191>
Process.exit(pid, :kill)
#=> true
receive do
msg -> msg
end
#=> {:DOWN, #Reference<0.906660723.3006791681.40191>, :process, #PID<0.118.0>, :noproc} monitor(item, options)Source
@spec monitor(pid() | {name, node()} | name, [:erlang.monitor_option()]) ::
reference()
when name: atom() Начинает мониторинг заданного item из вызывающего процесса.
Эта функция аналогична monitor/1, но принимает опции для настройки способа мониторинга item. См. :erlang.monitor/3 для документации по этим опциям.
Встраивается компилятором.
Примеры
pid =
spawn(fn ->
receive do
{:ping, source_alias} -> send(source_alias, :pong)
end
end)
#=> #PID<0.118.0>
ref_and_alias = Process.monitor(pid, alias: :reply_demonitor)
#=> #Reference<0.906660723.3006791681.40191>
send(pid, {:ping, ref_and_alias})
receive do: (msg -> msg)
#=> :pong
ref_and_alias = Process.monitor(pid, alias: :reply_demonitor)
#=> #Reference<0.906660723.3006791681.40191>
send(pid, {:ping, ref_and_alias})
receive do: (msg -> msg)
#=> {:DOWN, #Reference<0.906660723.3006791681.40191>, :process, #PID<0.118.0>, :noproc} put(key, value)Source
@spec put(term(), term()) :: term() | nil
Сохраняет заданную пару key-value в словаре процесса.
Значение возврата этой функции — значение, которое ранее хранилось по key, или nil в случае, если по нему не хранилось никаких значений.
Примеры
# Assuming :locale was not set iex> Process.put(:locale, "en") nil iex> Process.put(:locale, "fr") "en"
read_timer(timer_ref)Source
@spec read_timer(reference()) :: non_neg_integer() | false
Считывает таймер, созданный с помощью send_after/3.
Если результат — целое число, оно представляет собой время в миллисекундах, оставшееся до истечения таймера.
Если результат — false, таймер, соответствующий timer_ref, не был найден. Это может быть либо потому, что таймер истек, либо потому, что он был отменён, либо потому, что timer_ref никогда не соответствовал таймеру.
Даже если таймер истек и сообщение было отправлено, эта функция не сообщает вам, прибыло ли сообщение о тайм-ауте по назначению.
Встраивается компилятором.
register(pid_or_port, name)Source
@spec register(pid() | port(), atom()) :: true
Регистрирует заданный pid_or_port под заданным name на локальном узле.
name должен быть атомом и может затем использоваться вместо идентификатора PID/порта при отправке сообщений с помощью Kernel.send/2.
register/2 завершится ошибкой ArgumentError в любом из следующих случаев:
- PID/порт не существует локально и не активен
- Имя уже зарегистрировано
pid_or_portуже зарегистрировано под другимname
Следующие имена зарезервированы и не могут быть присвоены процессам или портам:
nilfalsetrue:undefined
Примеры
Process.register(self(), :test) #=> true send(:test, :hello) #=> :hello send(:wrong_name, :hello) ** (ArgumentError) argument error
registered()Source
@spec registered() :: [atom()]
Возвращает список имён, зарегистрированных с помощью register/2.
Встроено компилятором.
Примеры
Process.register(self(), :test) Process.registered() #=> [:test, :elixir_config, :inet_db, ...]
send(dest, msg, options)Source
@spec send(dest, msg, [option]) :: :ok | :noconnect | :nosuspend when dest: dest(), msg: any(), option: :noconnect | :nosuspend
Отправляет сообщение заданному dest.
dest может быть удалённым или локальным PID, локальным портом, локально зарегистрированным именем или кортежем вида {registered_name, node} для зарегистрированного имени на другом узле.
Встроено компилятором.
Параметры
:noconnect- при использовании, если для отправки сообщения требуется автоматическое подключение к другому узлу, сообщение не отправляется и возвращается:noconnect.:nosuspend- при использовании, если отправка сообщения приведет к приостановке отправителя, сообщение не отправляется и возвращается:nosuspend.
В противном случае сообщение отправляется и возвращается :ok.
Примеры
iex> Process.send({:name, :node_that_does_not_exist}, :hi, [:noconnect])
:noconnect send_after(dest, msg, time, opts \\ [])Source
@spec send_after(pid() | atom(), term(), non_neg_integer(), [option]) :: reference()
when option: {:abs, boolean()} Отправляет msg объекту dest через time миллисекунд.
Если dest является PID, это должен быть PID локального процесса, живого или нет. Если dest — атом, это должно быть имя зарегистрированного процесса, которое находится по запросу в момент доставки. Ошибка не генерируется, если имя не ссылается на процесс.
Сообщение не отправляется немедленно. Поэтому, dest может получить другие сообщения между отправкой, даже если time является 0.
Эта функция возвращает ссылку на таймер, который можно считать с помощью read_timer/1 или отменить с помощью cancel_timer/1.
Таймер будет автоматически отменен, если заданный dest — это PID, которое не активен, или когда заданный PID завершает работу. Обратите внимание, что таймеры не будут автоматически отменены, когда dest — это атом (поскольку разрешение атома выполняется при доставке).
Встроено компилятором.
Параметры
-
:abs- (логическое значение) когдаfalse,timeрассматривается как относительное к текущему монотонному времени. Когдаtrue,timeявляется абсолютным значением монотонного времени Erlang в тот момент, когдаmsgдолжно быть доставленоdest. Чтобы узнать больше о монотонном времени Erlang и других связанных с временем понятиях, ознакомьтесь с документацией модуляSystem. По умолчаниюfalse.
Примеры
timer_ref = Process.send_after(pid, :hi, 1000)
set_label(label)Source
@spec set_label(term()) :: :ok
Добавляет описательное обозначение к текущему процессу.
Обозначение не обязательно уникально, и в Erlang/OTP 27+ оно будет отображаться в наблюдателе и в логах сбоев. Это обозначение может быть полезным для идентификации процесса как одного из нескольких в данной роли, например, :queue_worker или {:live_chat, user_id}.
Примеры
Process.set_label(:worker)
#=> :ok
Process.set_label({:any, "term"})
#=> :ok sleep(timeout)Source
@spec sleep(timeout()) :: :ok
Засыпает текущий процесс на заданное timeout.
timeout — это либо количество миллисекунд, в качестве целого числа, либо атом :infinity. При задании :infinity, текущий процесс будет спать бесконечно и не будет потреблять или отвечать на сообщения.
Предел сна
До Elixir v1.18, sleep/1 не принимал значения времени ожидания, превышающие 16#ffffffff, то есть, 2^32-1. С Elixir v1.18 принимаются произвольно большие целые значения.
Используйте эту функцию с большой осторожностью. Почти во всех ситуациях, когда вы используете 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 # Optional timeout 30_000 -> :timeout end
В таких случаях, как выше, предпочтительнее Task.async/1 и Task.await/2.
Аналогично, если вы ожидаете завершения процесса, следите за этим процессом вместо засыпания. Не делайте:
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
# Optional timeout
30_000 -> :timeout
end spawn(fun, opts)Source
@spec spawn((-> any()), spawn_opts()) :: pid() | {pid(), reference()} Запускает заданную функцию в соответствии с заданными параметрами.
Результат зависит от заданных параметров. В частности, если :monitor задан в качестве параметра, он вернет кортеж, содержащий PID и ссылку на отслеживание, иначе только PID запущенного процесса.
Доступно больше параметров; для получения полного списка доступных параметров обратитесь к :erlang.spawn_opt/4.
Встроено компилятором.
Примеры
Process.spawn(fn -> 1 + 2 end, [:monitor])
#=> {#PID<0.93.0>, #Reference<0.18808174.1939079169.202418>}
Process.spawn(fn -> 1 + 2 end, [:link])
#=> #PID<0.95.0> spawn(mod, fun, args, opts)Source
@spec spawn(module(), atom(), list(), spawn_opts()) :: pid() | {pid(), reference()} Запускает заданную функцию fun из модуля mod, передавая заданные args в соответствии с заданными параметрами.
Результат зависит от заданных параметров. В частности, если :monitor задан в качестве параметра, он вернет кортеж, содержащий PID и ссылку на отслеживание, иначе только PID запущенного процесса.
Также принимает дополнительные параметры; для получения списка доступных параметров обратитесь к :erlang.spawn_opt/4.
Встроено компилятором.
unalias(alias)Source
@spec unalias(alias()) :: boolean()
Явно деактивирует псевдоним процесса.
Возвращает true если alias был активным псевдонимом для текущих процессов, или false в противном случае.
См. документацию модуля для получения дополнительной информации о псевдонимах. См. также :erlang.unalias/1.
Встроено компилятором.
Примеры
alias = Process.alias() Process.unalias(alias) #=> true
unlink(pid_or_port)Source
@spec unlink(pid() | port()) :: true
Удаляет связь между вызывающим процессом и заданным элементом (процессом или портом).
Если такой связи нет, эта функция ничего не делает. Если pid_or_port не существует, эта функция не генерирует ошибок и просто ничего не делает.
Значение возвращаемое этой функцией всегда true.
См. :erlang.unlink/1 для получения дополнительной информации.
Встроено компилятором.
unregister(name)Source
@spec unregister(atom()) :: true
Удаляет зарегистрированное name, связанное с PID или идентификатором порта.
Возникает ошибка ArgumentError, если имя не зарегистрировано ни для какого PID или порта.
Встроено компилятором.
Примеры
Process.register(self(), :test) #=> true Process.unregister(:test) #=> true Process.unregister(:wrong_name) ** (ArgumentError) argument error
whereis(name)Source
@spec whereis(atom()) :: pid() | port() | nil
Возвращает PID или идентификатор порта, зарегистрированный под name или nil, если имя не зарегистрировано.
См. :erlang.whereis/1 для получения дополнительной информации.
Примеры
Process.register(self(), :test) Process.whereis(:test) #=> #PID<0.84.0> Process.whereis(:wrong_name) #=> nil
© 2012-2024 The Elixir Team
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.18.1/Process.html