如何同时并行运行这两个独立循环。
let a1=Seq.map2 (fun a b->(1.0-a)/(a-b)) a2 a3
let b1=Seq.map2 (fun a b->a*b) b2 b3
答案 0 :(得分:2)
如果这是您经常使用的模式,那么编写一个并行运行两个Async
计算的泛型函数会很有用,例如:
module Async =
let Parallel2 (a: Async<'T>) (b: Async<'U>) : Async<'T * 'U> =
async {
let! res =
Async.Parallel [|
async { let! a = a in return box a }
async { let! b = b in return box b }
|]
return (res.[0] :?> 'T, res.[1] :?> 'U)
}
然后您可以这样使用它:
async {
let! a1, b1 =
Async.Parallel2
(async { return Array.map2 (fun a b->(1.0-a)/(a-b)) a2 a3 })
(async { return Array.map2 (fun a b->a*b) b2 b3 })
// ...
}
答案 1 :(得分:1)
尝试Array.zip
和Array.Parallel.map
?
Array.zip [|1;2;3|] [|2;3;4|] |> Array.Parallel.map (fun (a,b) -> a + b)
或只是使用ParallelSeq
(有关详细信息,请参阅http://fsprojects.github.io/FSharp.Collections.ParallelSeq/)