【问题标题】:tpl dataflow maxdegreeofparalellismtpl 数据流 maxdegreeofparallism
【发布时间】:2014-02-09 10:59:13
【问题描述】:

我正在使用 TPL 数据流构建管道。假设我有一个由四个 TransformBlocks 组成的管道

GetDataFromDatabase
ProcessData1
ProcessData2
SendDataToRestService

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

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

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

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

【问题讨论】:

  • 在我看来,后三个步骤可以在一个ActionBlock 中完成。无需管道。
  • 事实上,我不明白为什么你需要不止一个ActionBlock。只需将所有工作项发布到其中并使用异步工作委托。你可以这样设置并行度。
  • 你可能是对的,但是,如果我遗漏了什么,请原谅我,但你不能说任何管道吗?在这种情况下,它们的意义何在?
  • 我是 TPL 数据流的新手,但将块链接在一起的价值似乎在于组合具有不同行为的 不同 种块。如果您只需要一步式管道,那就这样吧。

标签: c# .net concurrency task-parallel-library tpl-dataflow


【解决方案1】:

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

第二,MaxDegreeOfParallelism设置最大值,也就是说TPL可以根据资源的可用性选择该范围内的任意数字。所以我不会害怕为所有这些块设置最大值,如果TPL 决定使用更少的线程会更好。

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

由于 MaxDegreeOfParallelism 属性表示最大并行度,因此数据流块可能以低于您指定的并行度执行。数据流块可以使用较低程度的并行性来满足其功能要求或解决可用系统资源的不足。数据流块永远不会选择比您指定的更大程度的并行度。

【讨论】:

  • 嗨。我已经考虑过减少我拥有的块数,但不确定我是否有充分的理由。我喜欢它的“工作单元”方面。但是,我想我可以看到,在这种情况下,它可能不是最好的做法,所以我将简化它。话虽如此,为了这个问题,我已经稍微简化了我的场景——也许我把它简化得太多了:-)。我当然要求我的一些块一次只处理一个,这就是他们目前正在做的事情。感谢您的帮助。
  • @user1158174 当然,随时。
【解决方案2】:

我认为这里有意义的是将两个 CPU 绑定块合并为一个。这样,您可以分别调整具有不同特征的块。

如果这是不可能的(例如,如果 CPU 绑定的块在管道中不彼此相邻,则可能发生这种情况),那么很可能仍然可以设置每个 CPU 的 MaxDegreeOfParallelism-绑定块到ProcessorCount。线程池很聪明,不会使用太多线程,除非它认为它会有利。虽然我认为在其他块(或程序的其他部分)中使用阻塞 IO 代码可能会混淆这一点,所以我建议使用异步 IO。

无论如何,使用多于必要的线程很可能不会是一个大问题。如果您确实需要解决此问题,您可以使用 a custom TaskScheduler that limits the number of threads 并将其设置为 CPU 绑定块的 DataflowBlockOptions.TaskScheduler

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多