首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >并发流图

并发流图
EN

Stack Overflow用户
提问于 2016-03-22 14:03:43
回答 1查看 170关注 0票数 4

好的,一堆信息:

场景

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

计算的性质

  • 操作,我需要执行形成流图的操作。edge代表一个完全独立的操作。在顶点A中,我只需要完成一项任务。在执行任务时,它会创建一组其他任务。因此,最终我将有数以百万计的任务。可视化:

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

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

问题

我该如何处理这个问题?ParallelPLINQ?Rx?数据流?还有别的吗?直接的线程池?

EN

回答 1

Stack Overflow用户

发布于 2016-03-22 14:15:54

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

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

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

您可能应该按照自定义计划的顺序处理图形。我的方法是先安排对外部服务的呼叫。这样,这些空白就可以被恰好可用的更快的任务所填补。

TaskScheduler抽象不适合这种情况。它和IO玩得不好。

在架构上,每当任务结束时,我都会做出调度决策。然后,你可以根据政策决定下一步该从什么开始。例如,您可能希望在运行中有与CPU内核相同的CPU绑定操作。您可能希望在任何时候都有N个IO操作未完成。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36156542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档