【问题标题】:Concurrent flow graph [closed]并发流程图[关闭]
【发布时间】:2016-03-22 14:03:43
【问题描述】:

好的,一堆信息:

场景

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

计算的性质

  • 我需要从 流程图 中执行的操作。而 edge 代表完全独立的操作。在顶点A 中,我开始时只有一项任务要做。当一个任务被执行时,它会创建一堆其他的任务来做。所以最终我将有数百万个任务。可视化:

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

仅以异步方式运行所有操作的简单方法会杀死机器 - 创建数百万个任务的开销是巨大的。

问题

我应该如何解决这个问题? Parallel? PLINQ?处方药?数据流?还有什么?直接线程池?

【问题讨论】:

  • 举个任务的例子。您可以只运行一个循环,而不是数百万个类似的任务。
  • 如果这在单个服务器上运行一个月,您还有其他问题需要担心。让它对失败有弹性并能够在失败后恢复将是我的首要任务。为什么您的方案将您限制在一台服务器上?
  • @Sinatr 简单任务示例:“café”->“cafe”。长任务示例:调用谷歌翻译翻译“café”。
  • @IanMercer 确实如此,但稍后会介绍。至于服务器 - 我正在使用 Azure。钱是不买更多资源的理由:)
  • 在 Azure 上,您按小时付费,因此您可以在有限的时间内轻松增加额外容量,然后在完成后关闭所有内容。如果你计算真的需要 30 天,那么你的 bug 生命周期会很长。

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


【解决方案1】:

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

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

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

您可能应该按照自定义的预定顺序处理图表。我的方法是首先安排对外部服务的调用。这样一来,可以用碰巧可用的更快任务来填补空白。

TaskScheduler 抽象不适用于此。它不能很好地与 IO 配合使用。

在架构上,我会在任务结束时做出调度决定。然后,您可以根据策略决定下一步要开始什么。例如,您可能希望运行中的 CPU 绑定操作与 CPU 内核的数量一样多。而且您可能希望随时有 N IO 操作未完成。

【讨论】:

    猜你喜欢
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多