Parallel.ForEach使用ASP.NET线程池中的线程吗?

4

我阅读过有关在ASP.NET Web应用程序中使用Task.Run的文章,文章指出这是一种不好的做法,因为它使用线程池中的另一个线程,从而阻止了这个特定线程用于请求服务。

那么Parallel.ForEach是否也存在相同的情况呢?它是否会使用线程池中的多个线程,从而阻止这些特定线程供请求使用?


Task.Run不好,Parallel.ForEach则不同。Task.Run会使用另一个线程,却没有提供任何好处。Parallel.ForEach可能会以更快的速度完成,但可能会牺牲其他请求。这可能是个问题,也可能不是。 - Panagiotis Kanavos
1个回答

10

Parallel.ForEach是否也存在相同的问题?它会使用来自线程池的多个线程,因此会阻止这些特定线程用于服务请求吗?

是的,它会。这意味着通过让请求使用多个线程,您将降低服务器的总吞吐量。那个单独的请求会更快地完成,但它将以其他请求为代价而更快地完成。

这还假设您的机器负载很高。如果线程池上没有足够高的负载,则可以为该请求分配更多资源,而不会抑制其他请求的能力,并且为该请求分配更多资源可能会加快该请求的速度。


谢谢Servy,你证实了我的想法。 - Anthony Hocquet
有人可能会说 Task.Run 更糟,因为它会使用另一个线程而没有任何速度优势。虽然 Parallel.ForEach 会更快地完成,但对其他请求的影响可能是个问题。 - Panagiotis Kanavos
1
@PanagiotisKanavos 好的,你可以使用 Task.Run 来实现并行处理。但是,如果你没有进行并行处理,而只是使用多个线程来执行顺序工作,那么你会浪费更多的资源,并且甚至无法加速该请求。 - Servy
此外,DOP 不应该保留默认值,否则 Parallel.ForEach 可能会生成与核心数量相同的任务,从而限制其他请求。 - Panagiotis Kanavos
@PanagiotisKanavos 如答案所述,如果您想使用 Parallel.ForEach,则使用它的原因是因为您希望该请求更快地完成,即使会减慢其他请求的速度(如果您的服务器当前受到 CPU 的限制),因此,如果您随后限制并行度,那么就会阻止这种情况发生,因此最好一开始就不要使用它。 如果您使用它,那么就是因为您希望该请求在可能牺牲其他请求的情况下加速完成。 - Servy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接