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
}
答案 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
现在可以“开箱即用”使用。