【问题标题】:Parallel.ForEach in C# when number of iterations is unknown当迭代次数未知时,C# 中的 Parallel.ForEach
【发布时间】:2014-09-10 15:35:56
【问题描述】:

我有 TPL(任务并行库)代码,用于在使用 .Net 4.0 的类库项目中在 C# 中并行执行循环。我是 C# 中的 TPL 新手,并且有以下问题。

代码背景: 在问题之后出现的代码中,我得到了所有未处理的批次,然后一次处理每个批次。由于批次之间没有依赖关系,因此每个批次都可以独立处理,但是对于每个批次,处理时的步骤顺序非常重要。

我的问题是:

  1. 在这种情况下,是否建议使用 Parallel.ForEach,其中批次数和迭代次数可能非常小或非常大,例如 10,000 个批次?恐怕批次太多,在这种情况下使用并行可能弊大于利。

  2. 当使用 Parallel.ForEach 时,ProcessBatch 方法中的步骤顺序是否保证以与 step1、step2、step3 和 step4 相同的顺序执行?

    public void ProcessBatches() {
       List < Batch > batches = ABC.Data.GetUnprocessesBatches();
    
       Parallel.ForEach(batches, batch = > {
          ProcessBatch(batch);
       });
    }
    
    public void ProcessBatch(Batch batch) {
       //step 1
       ABC.Data.UpdateHistory(batch);
    
       //step2
       ABC.Data.AssignNewRegions(batch);
    
      //step3
      UpdateStatus(batch);
    
      //step4
      RemoveBatchFromQueue(batch);
    }
    

更新 1:

从接受的答案来看,即使迭代次数很大,也不是问题。事实上,根据此 url 上的一篇文章:Potential Pitfalls in Data and Task Parallelism,当迭代次数多且迭代次数较少时,并行循环可能不会比顺序/同步循环提供任何好处。

因此,在循环中进行大量迭代似乎是使用 Parallel.ForEach 的最佳情况。

基本的经验法则是,迭代次数少且用户委托速度快的并行循环不太可能加速很多。

【问题讨论】:

    标签: c#-4.0 task-parallel-library class-library


    【解决方案1】:
    1. Parallel foreach 将为您运行的硬件提供适当数量的线程。所以不用担心批次太多造​​成伤害

    2. 每个批次的步骤将按顺序运行。 ProcessBatch 将在不同线程上针对不同批次调用,但对于每个批次,步骤将按照在该方法中定义的顺序执行

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-04
      • 2020-02-17
      • 1970-01-01
      • 2019-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多