如何在 <type>F# 中限制 list.asParallel 中的线程数

  • 本文关键字:list asParallel 线程 type f#
  • 更新时间 :
  • 英文 :


我在Stack Overflow等中看了几个例子,但我似乎无法让我的特定场景发挥作用。

我想迭代一个1500个项目的列表,但每个项目都会到达API,所以我想将并发线程的数量限制在6个左右。

这样做对吗?我只是担心它不会限制我需要的实际线程。

let fullOrders = 
orders.AsParallel().WithDegreeOfParallelism(6) |>
Seq.map (fun (order) -> getOrderinfo(order) )

您可以使用类似的东西来轻松测试

let orders = [ 0 .. 10 ]
let getOrderInfo a =
printfn "Starting: %d" a
System.Threading.Thread.Sleep(1000)
printfn "Finished: %d" a

这里的第一个问题是AsParallel不能与Seq.map一起工作(这只是一个集合上的正常同步迭代),因此以下任务按顺序运行,没有并行性:

let fullOrders = 
orders.AsParallel().WithDegreeOfParallelism(6) 
|> Seq.map (fun (order) -> getOrderInfo(order) )
fullOrders |> Seq.length

为了使其并行,您需要在ParallelQuery上使用Select方法,它正是您想要的:

let fullOrders = 
[0 .. 10].AsParallel().WithDegreeOfParallelism(6).Select(fun order ->
getOrderInfo(order) )
fullOrders |> Seq.length

注意,我在末尾添加了Seq.length,只是为了强制计算(惰性)序列。

最新更新