是否可以为 Array.Parallel 模块设置“MaxDegreeOfParallelism”(即要使用的最大线程数),因为它在后台使用Parallel.For?
问问题
1300 次
3 回答
3
根据这篇文章,似乎没有办法在 Parallel Extensions 的最终版本中全局限制线程数。brian 建议的替代方法是使用 PLINQ(适用于并行序列)而不是使用数组的函数。
这可以使用F# PowerPackPSeq
中的模块来完成。它提供了诸如 和许多其他与并行序列一起工作的函数(也可以使用流水线很好地组合)。对于并行序列,您可以使用WithDegreeOfParallelism 扩展方法来指定行为。PSeq.map
PSeq.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 回答