任务并行数据流中一个块与多个单线程目标块并行的原因

Reasons for Parallelism In One Block vs Multiple Single Threaded Target Blocks in Task Parallel Dataflow

创建 n 个没有并行性的 ITargetBlock<T> worker 与一个 MaxDegreeOfParallelism nMaxDegreeOfParallelism n worker 的原因或区别是什么?

               |-- TransformBlock<T, TOut> BoundedCapacity=1  --|
               |-- TransformBlock<T, TOut> BoundedCapacity=1  --|
BufferBlock<T> |                                                |-- ActionBlock<TOut>
               |-- TransformBlock<T, TOut> BoundedCapacity=1  --|
               |-- TransformBlock<T, TOut> BoundedCapacity=1  --|
           

BufferBlock<T>  --  TransformBlock<T, TOut> MaxDegreeOfParallelism=4  --  ActionBlock<TOut>

假设工作块执行长 运行 或 I/O 绑定工作,有大量物理处理器内核共享,以及 TOut 产生结果的顺序没关系。

  1. 前者效率较低,可能分配更多,具体取决于您的操作方式。
  2. 您必须通过自定义调度程序或其他一些同步方法来控制最大并行度
  3. 您无法利用 EnsureOrdered
  4. 整体管道更复杂,样板代码更多
  5. 调试起来稍微困难一些 (IMO)。

除非迫不得已,否则我只会对每个标准问题使用 1 个标准块,此时我会仔细研究自定义块的好处

注意:这个答案掩盖了很多要点(优点和缺点)并且缺少可能与以下内容相关的具体细节您的解决方案无法根据提供的信息得知

注 2 : 总而言之,如果你所做的只是 运行尽可能并行工作(除了提供的点数)