2017-06-13 3 views
0

Mein Genserver beendet nach einer Weile, nach dem Senden ein paar http-Anforderungen. Ich kann den Grund verstehen:Task.Await Timeout, die GenServer zu beenden verursacht

[error] GenServer MyGenServer terminating 
** (stop) exited in: Task.await(%Task{owner: #PID<0.420.0>, pid: #PID<0.1054.0>, ref: #Reference<....>}, 5000) 
    ** (EXIT) time out 
    (elixir) lib/task.ex:416: Task.await/2 
    (elixir) lib/enum.ex:966: Enum.flat_map_list/2 
    (my_app123) lib/my_genserver.ex:260: MyApp.MyGenServer.do_work/1 
    (my_app123) lib/my_genserver.ex:180: MyApp.MyGenServer.handle_info/2 
    (stdlib) gen_server.erl:601: :gen_server.try_dispatch/4 
    (stdlib) gen_server.erl:683: :gen_server.handle_msg/5 
    (stdlib) proc_lib.erl:247: :proc_lib.init_p_do_apply/3 
Last message: :tick 
State: [%{var1: "fdsafdsfd", var2: "43243242"}] 

ein Stück des Codes:

# it's called from handle_info 

    def do_work(some_data) do 
    Enum.map(some_data, fn(x) -> 
     Task.async(fn -> 
     case HTTPoison.post(.....) do 
     # ........... 

Ist "Task.async" verursacht das Timeout? Aber warum? Ja, es kann mehr als 5 Sekunden dauern, aber warum verursacht es eine Ausnahme, die dann GenServer beendet? Wie man es repariert?

über erwarten:

If the timeout is exceeded, await will exit; however, the task will continue to run. When the calling process exits, its exit signal will terminate the task if it is not trapping exits. 

Antwort

2

Da die Dokumentation sagt, Task.await hat ein Standard-Timeout von 5 Sekunden, nach der sie (beendet) das den anrufende Prozess beendet wird. Sie können das Timeout wie folgt erhöhen:

Task.await(task, 60000) # 1 minute 

und Sie können, indem :infinity als Timeout statt einer Nummer den Timeout vollständig entfernen:

Task.await(task, :infinity) 
+0

und wenn ich will nur nicht werfen einen Fehler entdeckt? nämlich, es still zu treten? versuch ... fang in task.await ein? – Jodimoro

+0

Ich denke, Sie wollen 'Task.yield/2' dann, die eine Zeitüberschreitung akzeptiert und' nil' zurückgibt, wenn die Zeitüberschreitung auftritt, anstatt einen Fehler zu werfen und '{: ok, value}' bei Erfolg zurückgibt. – Dogbert

+0

'Standard-Timeout von 5 Sekunden, nach dem es einen Fehler wirft '- wo heißt es" Fehler "in der Dokumentation? – Jodimoro

Verwandte Themen