3

是否可以为 Array.Parallel 模块设置“MaxDegreeOfParallelism”(即要使用的最大线程数),因为它在后台使用Parallel.For?

4

3 答案 3

3

根据这篇文章,似乎没有办法在 Parallel Extensions 的最终版本中全局限制线程数。brian 建议的替代方法是使用 PLINQ(适用于并行序列)而不是使用数组的函数。

这可以使用F# PowerPackPSeq中的模块来完成。它提供了诸如 和许多其他与并行序列一起工作的函数(也可以使用流水线很好地组合)。对于并行序列,您可以使用WithDegreeOfParallelism 扩展方法来指定行为。PSeq.mapPSeq.filter

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

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

然后写:

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

这可能具有不同的性能,因为它的实现方式与Array.Parallel模块中的功能不同,但这当然取决于您的场景。

于 2010-05-07T17:35:32.630 回答
1

不,我不这么认为。

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

于 2010-05-07T16:58:28.513 回答
0

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

myArray 
|> Array.Parallel.iter (fun item -> doWork item)

let maxPara = 10
myArray
|> Array.splitInto maxPara
|> Array.Parallel.iter (fun items -> items |> List.iter (fun item -> doWork item))
于 2019-10-01T20:15:42.490 回答