我在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
,只是为了强制计算(惰性)序列。