并发流程图

时间:2016-03-22 14:03:44

标签: c# parallel-processing system.reactive tpl-dataflow

好的,一堆信息:

方案

  • 没有用户界面。
  • 我需要在服务器上进行大量计算。
  • 目前,预计完成时间为
  • 我需要使用可用的最佳技术并行化代码。我可以牺牲很多时间来改善这一点。
  • 假设代码的同步部分以最佳方式写入。提高性能的唯一可能方法是并行化独立操作。

计算的性质

  • 我需要执行的操作形成流程图。 edge代表完全独立的操作。在顶点A中,我只从一个任务开始。在执行任务时,它会创建一系列其他任务。所以最后我会有数百万的任务。可视化:

enter image description here

  • 绝大多数操作都非常快。它们需要100毫秒。但是,其中一些更长。这些是对外部服务的请求。

以异步方式运行所有操作的简单方法会导致计算机崩溃 - 创建数百万个任务的开销很大。

问题

我该如何处理这个问题? ParallelPLINQ?接收?数据流?别的什么?线程池直接?

1 个答案:

答案 0 :(得分:2)

一百万个TPL任务不是直接问题。这将消耗几百MB的内存。可能还有其他数据附加到那些导致高内存消耗的任务。

此外,TPL很容易随着时间的推移产生无限数量的线程。它不知道如何正确安排IO。线程数无限地上升。

您使用什么机制来安排这项工作:总时间过长并不重要。调度和运行一百万个无操作任务只需几秒钟。

您可能应该按自定义排程顺序处理图表。我的方法是首先安排对外部服务的调用。这样就可以通过恰好可用的更快的任务填补空白。

TaskScheduler抽象不适合这种情况。它与IO不匹配。

在架构上,我会在任务结束时做出调度决策。然后,您可以根据策略决定接下来要做什么。例如,您可能希望在飞行中拥有与CPU核心一样多的CPU绑定操作。您可能希望随时都有N IO操作。