我通过async_nolink运行受监督的任务,最后等待Task.yield_many
的多个结果 - 示例代码:
request =
1..10
|> Enum.map fn x ->
result = Task.Supervisor.async_nolink(Final.TaskSupervisor, fn ->
res = case x do
2 -> x + "abc"
_ -> x + x
end
end)
end
results = Task.yield_many(request, 5000)
现在当" 2"崩溃,我该如何识别号码?或者在现实世界中,这将是启动任务的事件(在我的情况下是域名)。
我写了很长的reduce代码,将任务保存在一个列表中,task.ref
的元组和另一个列表中的标识符(域名)。然后我将这些任务与另一组任务相结合,并在yield_many
再次交叉比较之后...对于像elixir这样美丽的语言似乎太乱了:)
我错过了一些更简单的选择吗?
答案 0 :(得分:0)
我会使用Value Changed
压缩原始数据,因为Task.yield_many(tasks)
的结果与任务列表的顺序相同:
Task.yield_many
输出(不包括崩溃消息):
Task.Supervisor.start_link name: MyApp.TaskSupervisor
data = 1..10
tasks = for x <- data do
Task.Supervisor.async_nolink(MyApp.TaskSupervisor, fn ->
case x do
2 -> x + "abc"
4 -> raise "I don't like 4!"
_ -> x + x
end
end)
end
for {datum, {_task, result}} <- Enum.zip(data, Task.yield_many(tasks)) do
IO.puts "#{datum} => #{inspect(result)}"
end