【发布时间】: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