Elixir語言中 Task.yield
相關用法介紹如下。
用法:
yield(task, timeout \\ 5000)
@spec yield(t(), timeout()) :: {:ok, term()} | {:exit, term()} | nil
暫時阻塞等待任務回複的調用者進程。
如果收到回複,則返回 {:ok, reply}
,如果沒有回複,則返回 nil
,如果任務已經退出,則返回 {:exit, reason}
。請記住,通常任務失敗也會導致擁有該任務的進程退出。因此,如果至少滿足以下條件之一,此函數可以返回 {:exit, reason}
:
- 任務進程退出,原因是
:normal
- 任務未鏈接到調用者(任務以
Task.Supervisor.async_nolink/2
Task.Supervisor.async_nolink/4
- 調用者正在捕獲出口
超時,以毫秒或 :infinity
為單位,可以使用默認值 5000
給出。如果在收到來自任務的消息之前時間用完,此函數將返回 nil
並且監視器將保持活動狀態。因此
可以在同一任務上多次調用。yield/2
此函數假定任務的監視器仍處於活動狀態或監視器的:DOWN
消息在消息隊列中。如果已被監控或消息已收到,該函數將等待等待消息的超時時間。
如果您打算在任務未在 timeout
毫秒內響應的情況下關閉任務,則應將其與
鏈接在一起,如下所示:shutdown/1
case Task.yield(task, timeout) || Task.shutdown(task) do
{:ok, result} ->
result
nil ->
Logger.warn("Failed to get a result in #{timeout}ms")
nil
end
如果您打算檢查任務但在超時後讓它繼續運行,您可以將其與
鏈接在一起,如下所示:ignore/1
case Task.yield(task, timeout) || Task.ignore(task) do
{:ok, result} ->
result
nil ->
Logger.warn("Failed to get a result in #{timeout}ms")
nil
end
這確保了如果任務在 timeout
之後但在
被調用之前完成,您仍然會得到結果,因為 shutdown/1
旨在處理這種情況並返回結果。shutdown/1
相關用法
- Elixir Task.yield_many用法及代碼示例
- Elixir Task.Supervisor.async_stream用法及代碼示例
- Elixir Task.async用法及代碼示例
- Elixir Task.await_many用法及代碼示例
- Elixir Task.Supervisor用法及代碼示例
- Elixir Task.completed用法及代碼示例
- Elixir Task.Supervisor.start_child用法及代碼示例
- Elixir Task.async_stream用法及代碼示例
- Elixir Task.Supervisor.async_nolink用法及代碼示例
- Elixir Task.Supervisor.start_link用法及代碼示例
- Elixir Task.await用法及代碼示例
- Elixir Task用法及代碼示例
- Elixir Time.add用法及代碼示例
- Elixir Time.new用法及代碼示例
- Elixir Tuple.duplicate用法及代碼示例
- Elixir Time.to_erl用法及代碼示例
- Elixir Tuple用法及代碼示例
- Elixir Time.utc_now用法及代碼示例
- Elixir Tuple.sum用法及代碼示例
- Elixir Time.to_iso8601用法及代碼示例
- Elixir Time.from_iso8601用法及代碼示例
- Elixir Time.from_erl!用法及代碼示例
- Elixir Time.from_seconds_after_midnight用法及代碼示例
- Elixir Tuple.product用法及代碼示例
- Elixir Time.truncate用法及代碼示例
注:本文由純淨天空篩選整理自elixir-lang.org大神的英文原創作品 Task.yield(task, timeout \\ 5000)。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。