F# での非同期ワークフローを説明するために使用される一般的な例は、複数の Web ページを並行して取得することです。http://en.wikibooks.org/wiki/F_Sharp_Programming/Async_Workflows将来的にリンクが変更された場合に備えて、ここにコードを示します。
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()
私が知りたいのは、ネットワーク接続の喪失など、グローバルな状態の変化をどのように処理すべきかということです? これを行うエレガントな方法はありますか?
Async.Parallel 呼び出しを行う前にネットワークの状態を確認できますが、実行中に状態が変わる可能性があります。ネットワークが失敗するのではなく、ネットワークが再び利用可能になるまで実行を一時停止することを望んでいたと仮定すると、これを行う機能的な方法はありますか?