当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Elixir Task.yield用法及代码示例


Elixir语言中 Task.yield 相关用法介绍如下。

用法:

yield(task, timeout \\ 5000)
@spec yield(t(), timeout()) :: {:ok, term()} | {:exit, term()} | nil

暂时阻塞等待任务回复的调用者进程。

如果收到回复,则返回 {:ok, reply},如果没有回复,则返回 nil,如果任务已经退出,则返回 {:exit, reason}。请记住,通常任务失败也会导致拥有该任务的进程退出。因此,如果至少满足以下条件之一,此函数可以返回 {:exit, reason}

超时,以毫秒或 :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-lang.org大神的英文原创作品 Task.yield(task, timeout \\ 5000)。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。