Согласно этому посту , похоже, что в окончательной версии Parallel Extensions нет способа ограничить количество потоков глобально. Альтернативой тому, что предлагает Брайан, было бы использование PLINQ (который работает с параллельными последовательностями) вместо функций, которые работают с массивами.
Это можно сделать с помощью модуля PSeq
из F # PowerPack . Он предоставляет такие функции, как PSeq.map
, PSeq.filter
и многие другие, которые работают с параллельными последовательностями (которые также могут быть красиво составлены с использованием конвейерной обработки). Для параллельных последовательностей можно использовать метод расширения WithDegreeOfParallelism , чтобы указать поведение.
Вы можете реализовать для него функцию-обертку:
[РЕДАКТИРОВАТЬ: Это уже там!]
let withDegreeOfParallelism n (pq:ParallelQuery<_>) =
pq.WithDegreeOfParallelsm(n)
А потом напишите:
let res =
data |> PSeq.map (fun n -> ...)
|> PSeq.withDegreeOfParallelism ParallelOptions.MaxDegreeOfParallelism
|> Array.ofSeq
Это может иметь разные характеристики, потому что оно реализовано не так, как функции в модуле Array.Parallel
, но это, безусловно, зависит от вашего сценария.