我正在使用TPL Dataflow构建管道。假设我有一个包含四个TransformBlocks的管道

GetDataFromDatabase
ProcessData1
ProcessData2
SendDataToRestService


这些中的每一个都可能(很可能是)长期运行。 GetDataFromDatabase可能主要是在等待数据库响应,SendDataToRestService在等待服务响应。 ProcessData 1和2将长时间运行本地的CPU密集型进程。

现在,我的意图是将我每个块的maxdegreeofparalellism设置为机器上的内核数(可能为4)。

但是对我来说,这意味着它将一次执行4个GetDataFromDatabases,一次执行4个ProcessData1,一次执行4个ProcessData2,一次执行4个SendDataToRestService。这意味着我可能同时运行16个线程。除此之外,我实际上有3个不同的流程同时在做类似的事情。

问题:最好的方法是什么,以便获得最佳性能?从我读到的内容来看,如果我尝试做太多事情,由于上下文切换,实际上会降低性能。有没有最好的方法,还是“吸一看”?

最佳答案

首先,按照@usr的建议,您的情况适合单个ActionBlock。链接多个块的目的是组成具有不同配置的不同类型的块。例如,如果您的一个步骤的MaxDegreeOfParallelism为1,而另一步骤的值为10。

其次,MaxDegreeOfParallelism设置最大值,这意味着TPL可以根据资源的可用性选择该范围内的任何数字。因此,我不必担心为所有这些块设置最大值,并且如果TPL决定最好使用较少的线程,则可以。

来自How to: Specify the Degree of Parallelism in a Dataflow Block


  因为MaxDegreeOfParallelism属性表示最大并行度,所以执行数据流块的并行度可能比指定的并行度小。数据流块可以使用较少的并行度来满足其功能要求或解决可用系统资源不足的问题。数据流块决不会选择比您指定的更大的并行度。

10-06 11:25