當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Elixir Process.sleep用法及代碼示例


Elixir語言中 Process.sleep 相關用法介紹如下。

用法:

sleep(timeout)
@spec sleep(timeout()) :: :ok

休眠給定 timeout 的當前進程。

timeout 是以整數形式休眠的毫秒數或原子 :infinity 。當給定:infinity時,當前進程將永遠休眠,不消費也不回複消息。

使用此函數時要格外小心。對於幾乎所有在 Elixir 中使用 sleep/1 的情況,可能有一種更正確、更快和更精確的方式來實現消息傳遞。

例如,如果您正在等待某個進程執行某些操作,最好通過消息來傳達此類操作的進度。

換句話說,不要:

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

相關用法


注:本文由純淨天空篩選整理自elixir-lang.org大神的英文原創作品 Process.sleep(timeout)。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。