我想使用任务并行库来执行一些计算密集型任务,但一位同事告诉我,IIS 创建工作线程会产生巨大的开销。
我不太确定当你调用 Task.Factory.StartNew() 时会发生什么......比如说 100 次。 IIS 如何处理这个问题?这是一个巨大的风险,还是有办法使它对应用程序非常有利?
最佳答案
第一个任务!=线程。您可能有许多任务由几个线程(已被池化)提供服务。
作为一般规则,我反对在 Web 服务器上运行长时间运行的进程。保持长时间运行的作业存在大量问题,并且您往往会降低 Web 服务器的可扩展性,特别是在并行化长时间运行的 CPU 密集型作业时。不要忘记机器上运行的最佳线程数等于“逻辑”核心的数量。您希望避免创建多余的线程(每个托管线程都会消耗大约一兆的开销)。运行 CPU 密集型作业会占用处理请求的 CPU 时间。
在我看来,在 Web 服务器上使用 tpl 的最佳方法是,在使用它时,您的目标是尽可能地非阻塞地发出请求,这样可以通过以下方式处理最大数量的请求:最小线程数。请记住,许多人认为通过高度异步请求处理获得的额外规模不值得额外的复杂性。取决于您的具体情况。
简而言之,在 Web 服务器上运行许多长时间运行的 cpu 密集型任务会危及您的可扩展性。如果您使用任务、线程、后台 worker 或线程池,这并不重要。归根结底都是一样的。
关于c# - 任务并行库和 IIS 工作线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11269138/