Wie würden Sie die Ergebnisse einer Liste von Async a
in Haskell wie sie verfügbar werden sammeln? Die Idee ist, die Ergebnisse von asynchronen Aufgaben zu verarbeiten, sobald sie verfügbar sind.Das Sammeln der Async Ergebnisse sobald sie verfügbar sind
Das Beste, was ich die folgende Funktion mit ist einfiel:
collect :: [Async a] -> IO [a]
collect [] = return []
collect asyncs = do
(a, r) <- waitAny asyncs
rs <- collect (filter (/= a) asyncs)
return (r:rs)
Allerdings ist diese Funktion nicht zeigt das gewünschte Verhalten, da, wie in der unten stehenden Kommentar darauf hingewiesen, es nicht bis alles zurückkehrt Die asynchronen Aufgaben sind abgeschlossen. Außerdem läuft collect
in O(n^2)
, da ich die Liste bei jedem rekursiven Schritt filtere. Dies könnte verbessert werden, indem eine effizientere Struktur verwendet wird (und möglicherweise die Position der Async
Werte in der Liste indexiert wird).
Vielleicht gibt es Bibliotheksfunktionen, die sich darum kümmern, aber ich konnte sie nicht im Control.Concurrent.Async
Modul finden und ich frage mich warum.
EDIT: nachdem das Problem etwas genauer zu denken, ich frage mich, ob eine solche Funktion ist eine gute Idee. Ich könnte einfach fmap
auf den asynchronen Aufgaben verwenden. Vielleicht ist es besser, auf die Ergebnisse zu warten, wenn keine andere Wahl ist.
Ihr 'collect' kehrt erst zurück, wenn alle Async's in der Liste abgeschlossen sind. Ist es das wonach du suchst? –
Nein. Das habe ich nicht bemerkt. Meine Implementierung ist in der Tat falsch. Meine Idee war 'collect' und gab ein Ergebnis zurück, sobald der asynchrone Thread fertig ist. Ich werde meine Antwort entsprechend bearbeiten. –