是否有可能为Array.Parallel模块设置'MaxDegreeOfParallelism'(即使用的最大线程数),因为在引擎盖下it uses Parallel.For?
答案 0 :(得分:3)
根据this post,似乎无法在最终版本的Parallel Extensions中全局限制线程数。 brian建议的替代方法是使用PLINQ(使用并行序列)而不是使用数组的函数。
可以使用F# PowerPack中的PSeq
模块完成此操作。它提供了PSeq.map
,PSeq.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}}