F#是否有一个Async.Sequential来匹配Async.Parallel?

时间:2018-09-06 13:23:20

标签: asynchronous f#

F#的Async.Parallel类型签名为seq<Async<'a>> -> Async<'a list>,它将使用一系列Async类型,为它们准备并行运行,并输出一个异步。

我想知道是否有相似的Async.Sequential具有相同的类型签名,但是每个项目都依次运行?我觉得我一定缺少明显的东西吗?

我想做以下事情:

async {
    let! results =
        myItems
        |> List.map myAsynchronousOperation
        |> Async.Sequential

    ... do something with results
}

4 个答案:

答案 0 :(得分:2)

我不认为它是内置的,但是编写自己的应该是微不足道的:

let sequential s = async {
    let results = ResizeArray()
    for a in s do
        let! result = a
        results.Add(result)
    return List.ofSeq results
}

答案 1 :(得分:2)

按顺序评估seq<Async<'a>>的项目并返回列表实际上只是您要评估foldBack的序列上的async,而之前只是cons -将其添加到列表中。尽管kvb的解决方案确实可行,但您也可以使用Seq.foldBack来做到这一点,例如:

module Async =
    let sequential s = 
        Seq.foldBack (fun cur acc -> async.Bind(cur, fun head -> 
            async.Bind(acc, fun tail -> async.Return(head :: tail)))) s (async.Return [])

答案 2 :(得分:1)

如果愿意使用AsyncSeq库,那么以下将完成给定示例中的工作:

async {
    let! results =
        myItems
        |> AsyncSeq.ofSeq
        |> AsyncSeq.mapAsync myAsynchronousOperation
        |> AsyncSeq.toListAsync

    ... do something with results
}

如果您还没有将AsyncSeq用于其他用途,则可能会导致过度杀伤。

答案 3 :(得分:1)

随着F#4.7和FSharp.Core 4.7的发布,Async.Sequential现在可以“开箱即用”使用。

公告:https://devblogs.microsoft.com/dotnet/announcing-f-4-7/

来源:https://github.com/dotnet/fsharp/blob/897afd3dad3bfe58a0495713e99a8094098c18c5/src/fsharp/FSharp.Core/async.fs#L1282