Array.Parallel的'MaxDegreeOfParallelism'?

时间:2010-05-07 16:46:59

标签: f# arrays parallel-processing

是否有可能为Array.Parallel模块设置'MaxDegreeOfParallelism'(即使用的最大线程数),因为在引擎盖下it uses Parallel.For?

3 个答案:

答案 0 :(得分:3)

根据this post,似乎无法在最终版本的Parallel Extensions中全局限制线程数。 brian建议的替代方法是使用PLINQ(使用并行序列)而不是使用数组的函数。

可以使用F# PowerPack中的PSeq模块完成此操作。它提供了PSeq.mapPSeq.filter等许多其他功能,可以使用并行序列(也可以使用流水线很好地组合)。对于并行序列,您可以使用WithDegreeOfParallelism extension method指定行为。

你可以为它实现一个包装函数:
[编辑:它已经存在!]

let withDegreeOfParallelism n (pq:ParallelQuery<_>) = 
  pq.WithDegreeOfParallelsm(n)

然后写:

let res = 
  data |> PSeq.map (fun n -> ...)
       |> PSeq.withDegreeOfParallelism ParallelOptions.MaxDegreeOfParallelism
       |> Array.ofSeq

这可能有不同的性能,因为它的实现方式与Array.Parallel模块中的函数不同,但这肯定取决于您的情况。

答案 1 :(得分:1)

不,我不这么认为。

您始终可以使用array.fs中的源代码(在Array.Parallel中)作为入门者,在CTP release模块中创建自己的任何方法版本。

答案 2 :(得分:0)

假设我要说的是我一直要替换的最多10个线程:

let maxPara = 10
myArray
|> Array.splitInto maxPara
|> Array.Parallel.iter (fun items -> items |> List.iter (fun item -> doWork item))

使用

{{1}}