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)。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。