假设我有这两个功能:
let dowork n =
async {
do printfn "work %d" n
}
let work i = async {
do! Async.Sleep(2000)
printfn "work finished %d" i }
Run Code Online (Sandbox Code Playgroud)
我如何使用Async.Parallel同时运行它们并在继续之前等待两者完成?
Mis*_*hor 29
如前所述,您只需将异步函数放入序列中并将其传递给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"
Run Code Online (Sandbox Code Playgroud)
gra*_*bot 13
Async.Parallel采取一系列异步.在这种情况下,我传递一个列表.
[dowork 1; work 2]
|> Async.Parallel
|> Async.RunSynchronously
|> ignore
Run Code Online (Sandbox Code Playgroud)
如果要返回不同类型的数据,请使用Discriminated Union.
type WorkResults =
| DoWork of int
| Work of float32
let dowork n =
async {
do printfn "work %d" n
return DoWork(n)
}
let work i = async {
do! Async.Sleep(2000)
printfn "work finished %d" i
return Work(float32 i / 4.0f)
}
[dowork 1; work 2]
|> Async.Parallel
|> Async.RunSynchronously
|> printf "%A"
Run Code Online (Sandbox Code Playgroud)
产量
work 1
work finished 2
[|DoWork 1; Work 0.5f|]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3401 次 |
| 最近记录: |