Elixir等待多个并发任务中的任何一个完成

时间:2020-05-22 12:15:26

标签: asynchronous async-await elixir

我有一个函数,可以通过http向主机发布一些数据,并返回一个:ok:error元组响应。我想创建一些可以同时调用该函数的代码,将相同的数据发布到分布在世界各地的不同主机上,但是具有以下行为:

  • 等待直到收到 first 成功响应,此时我的代码将返回成功响应。在这一点上,我不想杀死未完成的任务,但是我不在乎它们是否成功。
  • OR等待每个请求失败,此时我的代码应以错误响应。

例如,我可以使用Task.async同时发送多个请求:

pids = [host1, host2, host3]
|> Enum.map(& Task.async(MyModule, :post_data, [&1, payload]))

我可以使用Task.yield_many等待所有任务完成,但是我无法确定的是如何仅等待任何一项任务成功完成。我有点需要Task.yield_any。有什么想法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

最简单的方法可能是启动链接的任务和trap exists。一旦完成任何任务,您的代码就会收到:DOWN消息。

另一种方法是让您的任务在退出之前将消息发送回父进程。

或者,作为最后的选择,您可能会以较小的超时在循环中运行Task.yield_many/2,尽管这有点反常。

相关问题