C# 并发流图

C# 并发流图,c#,parallel-processing,system.reactive,tpl-dataflow,C#,Parallel Processing,System.reactive,Tpl Dataflow,好的,一堆信息: 脚本 没有用户界面 我需要在服务器上做很多计算 就目前而言,完成这些任务的预计时间是一个月 我需要使用最好的技术并行化代码。我可以牺牲很多时间来改进这个 假定代码的同步部分以最佳方式编写。提高性能的唯一可能方法是并行化独立操作 计算的性质 我需要执行的操作形成流程图。edge表示完全独立的操作。在vertexA中,我只开始一项任务。当执行一项任务时,它会创建一组其他任务来执行。所以最终我会有数百万的任务。可视化: 绝大多数操作都非常快速。它们需要大约100毫秒。不过

好的,一堆信息:

脚本
  • 没有用户界面
  • 我需要在服务器上做很多计算
  • 就目前而言,完成这些任务的预计时间是一个月
  • 我需要使用最好的技术并行化代码。我可以牺牲很多时间来改进这个
  • 假定代码的同步部分以最佳方式编写。提高性能的唯一可能方法是并行化独立操作
计算的性质
  • 我需要执行的操作形成流程图。edge表示完全独立的操作。在vertex
    A
    中,我只开始一项任务。当执行一项任务时,它会创建一组其他任务来执行。所以最终我会有数百万的任务。可视化:

  • 绝大多数操作都非常快速。它们需要大约100毫秒。不过,其中一些更长。这些是对外部服务的请求
一个简单的异步运行所有操作的方法会杀死机器——创建数百万个任务的开销是巨大的

问题:
我应该如何处理这个问题<代码>并行<代码>PLINQ?接收?数据流?还有别的吗?直接使用线程池?

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

而且,TPL很容易随着时间的推移产生无限数量的线程。它不知道如何正确地安排IO。线程的数量实际上是无限增长的

无论您使用什么机制来安排这项工作:它与所用的总时间无关。调度和运行一百万个无操作任务只需几秒钟

您可能需要按照自定义的计划顺序处理图形。我的方法是先安排外部服务的通话。通过这种方式,可以用碰巧可用的更快的任务来填补空白

TaskScheduler
抽象不适用于此。它与IO的配合不太好


在架构上,每当任务结束时,我都会做出调度决策。然后,您可以根据策略决定下一步要开始什么。例如,您可能希望在运行中有尽可能多的CPU绑定操作,就像有CPU核心一样。您可能希望在任何时候都有N个IO操作未完成。

请给出一个任务示例。你可以只让一个任务运行一个循环,而不是百万个类似的任务。如果这在一台服务器上运行一个月,你还需要担心其他问题。在我的清单上,让它对失败具有弹性,并在失败后能够恢复。为什么您的场景仅限于一台服务器?@Sinatr简单任务示例:“café”->“cafe”。长任务示例:调用Google translate来翻译“café”。@IanMercer这是真的,但稍后将讨论。至于服务器,我正在使用Azure。金钱是不购买更多资源的原因:)在Azure上,你每小时付费,这样你就可以在有限的时间内轻松增加额外的容量,然后在完成后关闭一切。如果您的计算真的需要30天,那么您的bug生命周期将非常长。