私はFSharp.Collections.ParallelSeq
とretry computationを使用してスクレーパーを書いています。複数のページからHTMLを並行して取得したいと思います。失敗したときにリクエストを再試行したいと思います。例えば計算式を含むPSeq.mapがハングアップするのはなぜですか?
:
open System
open FSharp.Collections.ParallelSeq
type RetryBuilder(max) =
member x.Return(a) = a // Enable 'return'
member x.Delay(f) = f // Gets wrapped body and returns it (as it is)
// so that the body is passed to 'Run'
member x.Zero() = failwith "Zero" // Support if .. then
member x.Run(f) = // Gets function created by 'Delay'
let rec loop(n) =
if n = 0 then failwith "Failed" // Number of retries exceeded
else try f() with _ -> loop(n-1)
loop max
let retry = RetryBuilder(4)
let getHtml (url : string) = retry {
Console.WriteLine("Get Url")
return 0;
}
//A property/field?
let GetHtmlForAllPages =
let pages = {1 .. 10}
let allHtml = pages |> PSeq.map(fun x -> getHtml("http://somesite.com/" + x.ToString())) |> Seq.toArray
allHtml
[<EntryPoint>]
let main argv =
let htmlForAllPages = GetHtmlForAllPages
0 // return an integer exit code
私はGetHtmlForAllPages
main
からのコードと対話しようとハングアップするようです。コードをステップ実行すると、pages
の最初の4つの値に対してPSeq.map
が処理を開始することがわかります。その上で何が起こっている
は/完全に起動しないようにretry
計算式の原因は? PSeq
とretry
の間にいくつかの奇妙な相互作用がありますか?
コードは、私がGetHtmlForAllPages
機能を作成し、それを呼び出す場合は期待通りに動作します。 GetHtmlForAllPages
はフィールドであるときに何が起こっているのが不思議ですか?あなたは、静的コンストラクタ内デッドロックしているよう