Parallel.Foreach vs Foreach用于数据迁移过程

Ako*_*kon 0 c# asp.net parallel-processing performance parallel.foreach

我有一份车辆清单......对于每辆车,我正在做一些移民工作.

foreach (vehicles)
{

1 : Do database table migration for that vehicle
2 : Call an API and save them to database

}
Run Code Online (Sandbox Code Playgroud)

为了提高性能,我将其平行如下:

Parallel.Foreach(vehicles)
{
--same
}
Run Code Online (Sandbox Code Playgroud)
  1. 这是正确的方法吗?因为我的理解是,它将为每个请求的车辆创建新的线程,事情应该快速.

  2. 并行TASK会改进吗?

  3. 保持最大并行数是否好?如果是,如何确定该因素?

ReP*_*rre 5

  1. 如果每个Vehicle项目之间很少或没有依赖关系,这是正确的方法.换句话说,您(理想情况下)不应在每个执行lock的主体中具有任何(或其他同步原语).但是,如果您的代码中有s,那么它们应该在代码的一部分上执行得比方法的其余部分快得多:ActionVehiclelock

    Parallel.ForEach(vehicles, v => 
    {
        // Some code that takes long to execute
        lock(_syncRoot)
        {
            _totalProcessedVehicles ++;
        }  
    })
    
    Run Code Online (Sandbox Code Playgroud)

    Parallel.Foreach创建每线程Vehicle实例-这将产生多个线程,并给每个线程您的收藏来处理的一大块.线程数取决于您的硬件和可用资源.

  2. No. 在内部Parallel.Foreach使用Tasks,这样可以增加代码开销的负担.此外,使用与上面相同的逻辑在不同的线程上调度和执行任务:每个线程处理一大块Tasks.

  3. 我不建议指定最大程度的并行性 - 让它CLR为你做; 在绝大多数情况下,它会做得很好.但是,如果您确实要限制并行度,则会有一个重载Parallel.Foreach接受类型的参数ParallelOptions.使用该属性MaxDegreeOfParallelism可以限制并行度.