2016-10-19 3 views
0

ich überwachen Aufgaben über async_nolink laufen und am Ende wartet auf mehrere Ergebnisse mit Task.yield_many - Beispielcode:Elixir Aufgabe Identifizierung

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) 

Wenn nun Aufgabe von „2“ abstürzt genannt, wie kann ich die Nummer identifizieren? Oder in der realen Welt wäre das Ereignis, das die Aufgabe gestartet hat (in meinem Fall der Domänenname).

Ich schrieb lange reduzieren Code, der Aufgaben in einer Liste speichert, Tupel von task.ref und Bezeichner (Domänenname) in einem anderen. Dann kombiniere ich diese Aufgaben mit einer anderen Gruppe von Aufgaben und nach yield_many Kreuz wieder Vergleich ... Scheint viel zu chaotisch für schöne Sprache wie Elixier :)

Fehle ich etwas einfacher Alternative?

Antwort

0

Ich würde die ursprünglichen Daten mit Task.yield_many(tasks) da die Ergebnisse der Task.yield_many sind in der gleichen Reihenfolge wie die Liste der Aufgaben zip:

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 

Ausgang (mit Ausnahme der Crash-Nachrichten):

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} 
Verwandte Themen