【问题标题】:TPL how to know if a thread is asking for more work?TPL 如何知道线程是否要求更多工作?
【发布时间】:2011-09-29 19:17:47
【问题描述】:

我正在开展一个项目,该项目处理一些并行运行的任务。

要处理的任务数一般约为200个,可并行的任务数约为10个

我正在考虑使用 TPL,因为它简化了很多细节,还因为它提供了一种通过自定义 TaskScheduler 等来控制并发程度的方法。

但是,我也在尝试找到一个很好的功能,让我知道某个特定线程正在请求更多工作,并且 ThreadPool 的队列是空的,并且它没有更多工作可以从其他线程窃取。

这个可以吗?

编辑 1 我第一次不清楚。每次我只能将大约 50 个任务排队到 ThreadPool 中,我们不想等到全部 50 个项目都处理完。

【问题讨论】:

  • 你想用这些信息做什么?
  • 抱歉不清楚我已经编辑了这个问题,以便它可能清楚。
  • 如果您要自己进行调度,为什么要使用线程池?

标签: c# .net task-parallel-library


【解决方案1】:

但是,我也试图找到一个很好的功能,让我知道某个特定线程正在请求更多工作,并且 ThreadPool 的队列是空的,并且它没有更多工作可以从其他线程窃取。

不幸的是,ThreadPool 的内部工作原理并未公开。没有办法了解这些特定信息。

话虽如此,ThreadPool 作为一个单一的内聚单元工作 - 本地工作队列仅在单个线程池线程启动新任务时才重要,因为新任务被添加到该线程的本地工作队列中。 “线程池的队列是空的,它没有更多的工作可以从其他线程窃取”只会在整个线程池完成处理时发生,如果你是添加工作的人,它将在所有线程完成后立即发生你的工作完成了。这很容易检查...


编辑:

我第一次不清楚。每次我只能将大约 50 个任务排队到 ThreadPool 中,我们不想等到全部 50 个项目都处理完。

如果您使用的是 TPL,则只需将整个工作负载排队即可。通过使用自定义 TaskScheduler(甚至是默认的,它只依赖于 ThreadPool 的池化),您将自动获得资源池化,从而防止一次处理过多的工作项。随着您的工作量的增加,更多的项目将自动被安排......

【讨论】:

    【解决方案2】:

    为什么不为每个任务创建一个Task,然后全部启动? TPL 应该自动确定一次将多少个任务调度到线程池(它们不会同时运行并占用您的所有资源 - 它会将多个任务调度到线程池中,然后像之前那样调度更多任务完整的)。

    【讨论】:

      猜你喜欢
      • 2012-10-03
      • 2018-09-15
      • 2016-06-15
      • 2011-05-30
      • 2016-05-27
      • 2011-08-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多