2016-10-19 11 views
0

は私がasync_nolink経由教師タスクを実行し、最後にTask.yield_manyで複数の結果を待つ - コード例:「2」クラッシュによって呼び出されたタスクは、私は数をどのように識別することができたときに今エリクサータスク識別

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) 

?実際には、それはタスク(私の場合はドメイン名)を開始したイベントになります。

タプルをtask.refに、識別子(ドメイン名)を別のリストに保存する長いreduceコードを書いています。次に、このタスクを別のタスクグループと組み合わせて、yield_manyのクロス比較をもう一度やってみましょう...エリクシルのような美しい言葉のためにあまりにも面倒です:)

私はいくつかの簡単な選択肢がありませんか?

答えて

0

Task.yield_manyの結果は、タスクのリストと同じ順序であるので、私はTask.yield_many(tasks)と、元のデータを圧縮します:

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 

出力(クラッシュメッセージを除く):

1 => {:ok, 2} 
2 => {:exit, {:badarith, [{:elixir_compiler_0, :"-__FILE__/1-fun-0-", 1, [file: 'a.exs', line: 8]}, {Task.Supervised, :do_apply, 2, [file: 'lib/task/supervised.ex', line: 94]}, {Task.Supervised, :reply, 5, [file: 'lib/task/supervised.ex', line: 45]}, {:proc_lib, :init_p_do_apply, 3, [file: 'proc_lib.erl', line: 247]}]}} 
3 => {:ok, 6} 
4 => {:exit, {%RuntimeError{message: "I don't like 4!"}, [{:elixir_compiler_0, :"-__FILE__/1-fun-0-", 1, [file: 'a.exs', line: 9]}, {Task.Supervised, :do_apply, 2, [file: 'lib/task/supervised.ex', line: 94]}, {Task.Supervised, :reply, 5, [file: 'lib/task/supervised.ex', line: 45]}, {:proc_lib, :init_p_do_apply, 3, [file: 'proc_lib.erl', line: 247]}]}} 
5 => {:ok, 10} 
6 => {:ok, 12} 
7 => {:ok, 14} 
8 => {:ok, 16} 
9 => {:ok, 18} 
10 => {:ok, 20}