我有一个函数,可以通过http向主机发布一些数据,并返回一个:ok
或:error
元组响应。我想创建一些可以同时调用该函数的代码,将相同的数据发布到分布在世界各地的不同主机上,但是具有以下行为:
例如,我可以使用Task.async
同时发送多个请求:
pids = [host1, host2, host3]
|> Enum.map(& Task.async(MyModule, :post_data, [&1, payload]))
我可以使用Task.yield_many
等待所有任务完成,但是我无法确定的是如何仅等待任何一项任务成功完成。我有点需要Task.yield_any
。有什么想法可以解决这个问题吗?
答案 0 :(得分:1)
最简单的方法可能是启动链接的任务和trap exists。一旦完成任何任务,您的代码就会收到:DOWN
消息。
另一种方法是让您的任务在退出之前将消息发送回父进程。
或者,作为最后的选择,您可能会以较小的超时在循环中运行Task.yield_many/2
,尽管这有点反常。