具有限制的队列中的并发/并行Http调用

时间:2018-03-12 18:26:24

标签: f# queue message-queue

如果您有很多要调用的URL,那么F#中是否存在任何具有某种限制的队列模式,例如,在继续下一批之前,一次说5或10次调用。

let urls = [
    "http://example.com/1", 
    "http://example.com/2", 
    "http://example.com/3",
    ....
    "http://example.com/100"]

传递函数以调用

let getAsync (url:string) = 
    async {
        let httpClient = new System.Net.Http.HttpClient()
        let! response = httpClient.GetAsync(url) |> Async.AwaitTask
        response.EnsureSuccessStatusCode () |> ignore
        let! content = response.Content.ReadAsStringAsync() |> Async.AwaitTask
        return content
}

然后会收到所有结果和任何错误的列表,因为某些调用可能会因404或500错误等原因而失败。

1 个答案:

答案 0 :(得分:1)

首先,让您的函数实际返回错误信息,而不是将其作为异常抛出:

let getAsync url : Result<_,_> =
    async {
        try
            ...
            return (Ok content)
        with ex ->
            return (Error ex)
    }

然后使用Async.Parallel并行执行它们。此函数使用list<Async>并返回Async<list>

let allResults = urls |> List.map getAsync |> Async.Parallel