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.
und wenn ich will nur nicht werfen einen Fehler entdeckt? nämlich, es still zu treten? versuch ... fang in task.await ein? – Jodimoro
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
'Standard-Timeout von 5 Sekunden, nach dem es einen Fehler wirft '- wo heißt es" Fehler "in der Dokumentation? – Jodimoro