单个ASP.net请求有多个内核

本文关键字:内核 请求 ASP net 单个 | 更新日期: 2023-09-27 18:20:38

我正在尝试创建一个WebApi方法,该方法运行一系列难以进一步优化的循环计算。

x.Items.AsParallel().ForAll(item =>
{
    item.RunCalcs();
});

当执行此代码时,通过查看服务器任务管理器,它似乎只使单个处理器内核达到最大,而不影响其他内核。

据我所知,asp.net将单个请求限制为一个处理器内核。由于这是一个总体请求很少的intranet服务器,所以我不关心管理服务器资源。

有没有任何方法可以覆盖或绕过这种行为,使我的循环运行得更快?

单个ASP.net请求有多个内核

ASP.Net可以以一种非常巧妙的方式限制TPL使用的线程数。只需创建一个TaskScheduler(仅限于一个线程),并在给定的TaskScheduler上启动ASP.Net请求。我敢打赌,他们会有一批有限的TaskScheuler,这是有道理的。。。

那么,当您调用TPL或PLINQ时,处理ASP.Net请求的任务内部会发生什么?

它是通过调用Task.Start或更好的方式来安排任务,TPL团队更喜欢的方式是Task.Factory.StartNew.

但是,但是,BUTT:),这些是在任务调度器之上的调度任务。当前是我们已经在运行的有限任务调度器!因此,无论您的机器有多少核心,所有计划的任务都将在有限的TaskScheduler上燃烧。

另一方面,异步/等待操作似乎使用了.Net 4.5+中引入的新Task.Run(),有人建议它在TashScheduler上调度任务。默认情况下,ThreadPool本身是什么,所以除了核心数量之外没有任何限制。除了这个线索之外,我没有其他证据:关于Task.Start()、Task.Run()和Task.Factory.StartNew()TPL 的使用

不幸的是,AsParallel()没有重载任务调度程序。

因此,解决方案是:

  1. @SK已经建议使用Parallel类并指定并行度。该类早于PLINQ,并且正在使用看起来合适的ThreadPool
  2. 第二个想法是自己安排ThreadPool
  3. 或者在TaskScheduler上安排任务。默认情况下,以ThreadPool为目标
  4. 或者为ASP.Net生成自己的线程(最糟糕的主意)
  5. 或者使用async/await在TaskScheduler上运行工作。默认情况下,ThreadPool和async方法中使用AsParale(),因为有TaskScheduler.Current将与TaskScheduler相同。默认情况,只是ThreadPool

注意:请注意,在ASP.Net中的ThreadPool上安排繁重的工作可能会导致处理ASP.Net请求的性能下降