folgenden Code-Schnipsel vor:Wrapping Funktionsaufruf in Task.async verursacht seltsames Verhalten, das ich nicht verstehe
a)
IO.puts "test1"
task = Task.async fn ->
Foo.Bar.send_file_for_processing(file_url)
end
IO.puts "test2"
content = Task.await(task)
IO.puts "test4"
b)
IO.puts "test1"
content = Foo.Bar.send_file_for_processing(file_url)
IO.puts "test2"
und in Foo. Stabmodul:
def send_file_for_processing(file_url) do
json = file_url |> encoded_file |> request_json
IO.puts "test3"
request = HTTPoison.post(
@processing_endpoint,
json,
@headers,
params: %{"key": @api_key}, connect_timeout: 100000, recv_timeout: 100000, timeout: 100000
)
IO.puts "test5"
(...)
end
Wh de Ich benutze Code-Snippet a), der "test5" wird nie erreicht, als würde das Programm während der HTTPoison-POST-Anfrage hängen bleiben. Es endet nie. In der Zwischenzeit wird mit dem Snippet b) die HTTPoison-POST-Anforderung normal und ohne Verzögerungen abgeschlossen.
Um ehrlich zu sein, hat mich das Debuggen dazu gebracht etwas Zeit zu verlieren und ich verstehe das Problem mit dem Snippet a) immer noch nicht. Missbrauche ich das Task-Modul? Ich habe die Dokumentation überprüft und konnte nichts finden, was dieses Problem erklären würde.
EDIT: Ausgang für Schnipsel a)
test1
test2
test3
Sie haben 2 '" test3 "' Debug-Ausgabe, würde es Ihnen etwas ausmachen, eine von ihnen zu ändern und zu bestätigen, dass die Aufgabe eine Zeile _before_ HTTPoison Anfrage druckt? – mudasobwa
@mudasobwa done –
@ PawełDuda können Sie versuchen, ein minimales reproduzierbares Beispiel zu erstellen, das dieses Verhalten zeigt? – Dogbert