Asynchronous F#使用Async.Parallel并行运行两个任务
假设我有这两个功能:Asynchronous F#使用Async.Parallel并行运行两个任务,asynchronous,f#,Asynchronous,F#,假设我有这两个功能: let dowork n = async { do printfn "work %d" n } let work i = async { do! Async.Sleep(2000) printfn "work finished %d" i } 如何使用Async.Parallel并发运行它们,并在继续之前等待两者完成?Async.Parallel采用一系列Async。在这种情况下,我会给它一个列表 [dowork 1; work
let dowork n =
async {
do printfn "work %d" n
}
let work i = async {
do! Async.Sleep(2000)
printfn "work finished %d" i }
如何使用Async.Parallel并发运行它们,并在继续之前等待两者完成?
Async.Parallel
采用一系列Async。在这种情况下,我会给它一个列表
[dowork 1; work 2]
|> Async.Parallel
|> Async.RunSynchronously
|> ignore
如果要返回不同类型的数据,请使用
输出
work 1
work finished 2
[|DoWork 1; Work 0.5f|]
如前所述,您只需按顺序放置异步函数,并将它们传递给
async.Parallel
但是,如果需要执行返回不同类型结果的不同作业,可以使用Async.StartChild
:
let fn1 = async {
do! Async.Sleep 1000
printfn "fn1 finished!"
return 5
}
let fn2 = async {
do! Async.Sleep 1500
printfn "fn2 finished!"
return "a string"
}
let fncombined = async {
// start both computations simultaneously
let! fn1 = Async.StartChild fn1
let! fn2 = Async.StartChild fn2
// retrieve results
let! result1 = fn1
let! result2 = fn2
return sprintf "%d, %s" (result1 + 5) (result2.ToUpper())
}
fncombined
|> Async.RunSynchronously
|> printfn "%A"
当任务的数量在编译时固定时,我希望有这样一个助手函数:
模块异步=
设2 a b=
异步的{
//启动这两项任务
设!x=Async.StartChild a
让!y=Async.StartChild b
//等待两者都完成
设!i=x
让!j=y
//以强类型元组的形式返回两个结果
返回i,j
}
用法如下:
let work1=async{return 1}
让work2=async{返回“a”}
让工作1和2=
异步的{
让!(a,b)=异步并行2工作1工作2
打印fn“%i%s”a b
}
请注意任务的类型是如何不同的。这可能非常有用
我们可以为Async
添加额外的帮助程序,因为()
和((),())
具有相同的语义:
模块异步=
// ...
让doParallel2(a:Async)(b:Async)=
平行线2 a b
|>异步。忽略
然后应用于您的场景:
async{
do!Async.doParallel2(工作1)(工作2)
}
可能的重复,我不在乎你的答案是否不是选定的答案,对我来说,你才是真正的mvpI同意,我一直在试图找出如何做到这一点,而这个例子正是我想要的!
let fn1 = async {
do! Async.Sleep 1000
printfn "fn1 finished!"
return 5
}
let fn2 = async {
do! Async.Sleep 1500
printfn "fn2 finished!"
return "a string"
}
let fncombined = async {
// start both computations simultaneously
let! fn1 = Async.StartChild fn1
let! fn2 = Async.StartChild fn2
// retrieve results
let! result1 = fn1
let! result2 = fn2
return sprintf "%d, %s" (result1 + 5) (result2.ToUpper())
}
fncombined
|> Async.RunSynchronously
|> printfn "%A"