gpt4 book ai didi

elixir - 如何返回第一个异步任务以完成

转载 作者:行者123 更新时间:2023-12-04 10:36:39 25 4
gpt4 key购买 nike

我有几个异步运行的任务。根据输入,一个或多个可能会运行很长时间,但只有一个任务会返回 :success 消息。

slowtask = Task.async(slow())
fasttask = Task.async(fast())

如何捕获上述两个任务中的第一个完成,而不必等待另一个?我试过 Task.find/2 ,但因为它是用枚举实现的,它似乎在找到引用/消息之前等待所有退出信号。我的另一个想法是在 Stream.cycle 中投票,忽略仍然存在的任务并捕获已退出的任务。不过,似乎 un elixir 喜欢以这种方式进行轮询。

最佳答案

在 Elixir 上还没有简单的方法可以做到这一点。您最好的选择是,如果您只是在给定进程中等待这些消息,则是这样的:

  defmodule TaskFinder do
def run do
task1 = Task.async fn -> :timer.sleep(1000); 1 end
task2 = Task.async fn -> :timer.sleep(5000); 2 end
await [task1, task2]
end

# Be careful, this will receive all messages sent
# to this process. It will return the first task
# reply and the list of tasks that came second.
def await(tasks) do
receive do
message ->
case Task.find(tasks, message) do
{reply, task} ->
{reply, List.delete(tasks, task)}
nil ->
await(tasks)
end
end
end
end

IO.inspect TaskFinder.run

请注意,您也可以使用此模式在 GenServer 中生成任务并使用 Task.find/2找到匹配的。我还在 Elixir 文档中添加了这个例子。

关于elixir - 如何返回第一个异步任务以完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31577535/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com