Elixir任务识别

时间:2016-10-19 15:34:33

标签: elixir

我通过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这样美丽的语言似乎太乱了:)

我错过了一些更简单的选择吗?

1 个答案:

答案 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