如何并行运行代码?

时间:2015-09-22 13:30:44

标签: f# f#-3.0

如何同时并行运行这两个独立循环。

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

2 个答案:

答案 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.zipArray.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/