Ein häufig verwendetes Beispiel zur Darstellung asynchroner Workflows in F # ist das parallele Abrufen mehrerer Webseiten. Ein solches Beispiel ist gegeben bei: http://en.wikibooks.org/wiki/F_Sharp_Programming/Async_Workflows-Code abgebildet, falls der Link in der Zukunft ändert:Globale Status- und Async-Workflows in F #
open System.Text.RegularExpressions
open System.Net
let download url =
let webclient = new System.Net.WebClient()
webclient.DownloadString(url : string)
let extractLinks html = Regex.Matches(html, @"http://\S+")
let downloadAndExtractLinks url =
let links = (url |> download |> extractLinks)
url, links.Count
let urls =
[@"http://www.craigslist.com/";
@"http://www.msn.com/";
@"http://en.wikibooks.org/wiki/Main_Page";
@"http://www.wordpress.com/";
@"http://news.google.com/";]
let pmap f l =
seq { for a in l -> async { return f a } }
|> Async.Parallel
|> Async.Run
let testSynchronous() = List.map downloadAndExtractLinks urls
let testAsynchronous() = pmap downloadAndExtractLinks urls
let time msg f =
let stopwatch = System.Diagnostics.Stopwatch.StartNew()
let temp = f()
stopwatch.Stop()
printfn "(%f ms) %s: %A" stopwatch.Elapsed.TotalMilliseconds msg temp
let main() =
printfn "Start..."
time "Synchronous" testSynchronous
time "Asynchronous" testAsynchronous
printfn "Done."
main()
Was ich möchte wissen, ist, wie man Veränderungen in der globalen Zustand wie der Verlust einer Netzwerkverbindung behandeln sollte? Gibt es eine elegante Möglichkeit, dies zu tun?
Man könnte den Status des Netzwerks vor dem Aufruf von Async.Parallel überprüfen, aber der Status könnte sich während der Ausführung ändern. Angenommen, man wollte die Ausführung pausieren, bis das Netzwerk wieder verfügbar war, anstatt fehlzuschlagen. Gibt es dafür einen funktionalen Weg?
Tom, während ich F # -Agenten wirklich mag, sehe ich nicht, wie das funktionale Programmierung wie Haskell ist. Es scheint eher so zu sein, als behandle der Staat (die IO Monad in Haskell) etwas, das an eine Funktion übergeben werden soll, behandelt den Staat als etwas, das von mehreren Agenten "gleichzeitig" mutiert und mit Botschaften zwischen Agenten vermittelt wird. – JonnyBoats
Die Verwendung von Agenten ist definitiv keine funktionale Programmierung wie Haskell.Ich glaube ehrlich gesagt nicht, dass die rein funktionalen Lösungen für das Problem so elegant und nützlich sind. Message-Passing Concurrency ist nur ein weiteres nützliches Paradigma, das in F # verfügbar ist - und ich denke, es funktioniert wirklich gut für gleichzeitige Prozesse, die koordiniert werden müssen. –
Dies ist etwas, was ich versuche, mich im Moment zu bewegen. Nachdem ich FP über Leute wie Haskell entdeckt habe (aber immer noch sehr unerfahren), ist die Versuchung, auch in F # einen völlig reinen Ansatz zu wählen. Die richtige Mischung von Paradigmen zu finden, wird ein langer Lernprozess sein, denke ich. – shambulator