【问题标题】:ThreadPools vs Own Threads for long running processesThreadPools vs Own Threads 用于长时间运行的进程
【发布时间】:2011-05-24 11:29:09
【问题描述】:

我们有一些长期运行的业务流程正在通过在 WS 2008 R2 上的 IIS(集成模式)中运行的 WCF 服务启动。这些业务流程通常涉及与我们的 SQL Server 后端的大量交互。我们创建了一个自定义任务队列实现,请求通过初始服务调用排队,然后根据优先级执行。此执行可能需要很长时间才能完成(20-30 分钟极端)。然后,客户端可以向服务器查询他们自己的后台任务的进度。

在我们当前的实现中,任务在单独的线程上触发以执行,而不是从 ThreadPool 中触发。这是因为 reading recommendations 没有使用 ThreadPool 运行长时间运行的任务,以防止 ASP.NET 请求被饿死。我们通过对可以并发执行的后台任务数设置上限来控制产生的线程数。通过这种方式,我们尝试控制 CPU 上的负载并防止过多的线程上下文切换。虽然所有这些都在发生,但我们当然还需要为应用程序提供正常的“在线”请求。

在阅读了 Thomas Marquardt 的 this post 之后,我担心我们没有使用 ThreadPool,因为我们无法从其中内置的调整启发式算法中受益。我们已经通过挂钩 ApplicationEnd 事件并取消长时间运行的任务来解决 Thomas 提到的关闭问题。所以我的问题是,我们应该切换到使用 ThreadPool 吗?这些线程被长时间捆绑怎么办?如果我正确理解 Thomas,他说这无关紧要,因为 ThreadPool 会调整自身以创建更多请求来服务于正常的在线操作?我还通读了 this StackOverflow question 涵盖了相同的理由,但我仍然不确定前进的方向。

【问题讨论】:

  • 请详细说明:您认为您可能缺少哪些具体的调整?
  • 也许“tune”这个词不合适,但我指的是如果后台任务是使用 ThreadPool 线程执行的,那么 ThreadPool“会意识到”额外的“ load”被后台任务放到系统上。如果我们使用普通线程运行它们,那么 ThreadPool 就没有这些知识。同样,我不知道 ThreadPool 启发式如何精确工作的内部细节,但阅读 Thomas 的帖子引起了我的担忧,即我们通过运行它自己的非-ThreadPool 线程

标签: asp.net iis-7 threadpool


【解决方案1】:

这并不是您所要求的——但为什么不在一个单独的进程(比如 Windows 服务)中一起执行长时间运行的任务——无论如何,您正在构建一个优先级队列,并且客户端将在一段时间内查询结果之后。我会采用这种方法,即面向前端的 WCF 服务将请求排队并响应状态更新查询,而后台服务将继续为请求提供服务。这甚至允许工作进程回收等,而无需担心终止当前正在执行的任务。我看到的唯一问题是进程外通信的开销,但与任务所花费的时间(因为它们长时间运行)相比,它应该是微不足道的。

【讨论】:

    【解决方案2】:

    我的建议是避免使用 ThreadPool,因为我确实遇到了您提供的链接中建议的线程饥饿问题。

    我们的产品允许用户调用执行一系列报价的网络服务。这可能是一个长达 40 分钟的长时间运行过程,报价过程是 CPU 密集型的,因此,我们使用四核服务器上的线程池来获得最大的 CPU 使用率。

    但是,由于 ASP.NET 看起来好像它使用线程池来处理请求,我们遇到了一个问题,即由于池中缺少可用线程,用户提交的任何新作业在第一个作业完成之前永远不会开始.为了解决这个问题,我一直在使用我不久前在网上找到的一个名为 ThreadPoolThrottle 的类。这稍微缓解了一些问题,但随着系统使用量的增加,我们也遇到了同样的问题。

    我现在正在考虑 VinayC 的建议,即在进程外运行引号以防止我的 asp.net 应用程序中的线程不足。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-25
      • 1970-01-01
      • 2023-03-27
      相关资源
      最近更新 更多