【问题标题】:Prevent overload on remote system when using Parallel.ForEach()使用 Parallel.ForEach() 时防止远程系统过载
【发布时间】:2014-03-26 09:31:43
【问题描述】:

我们已经构建了这个应用程序,它需要在远程机器(实际上是 MatLab 服务器)上完成一些计算。我们正在使用 Web 服务连接到 MatLab 服务器并执行计算。

为了加快速度,我们使用了Parallel.ForEach() 以便同时进行多个服务调用。如果我们非常保守地将ParallelOptions.MaxDegreeOfParallelism (DOP) 设置为 4 或其他值,那么一切都会正常运行。 但是,如果我们让框架决定 DOP,它将产生如此多的线程,以至于它迫使远程机器跪下并开始发生超时(> 10 分钟)。

我们如何解决这个问题?我希望能够做的是使用响应时间来限制呼叫。如果响应时间小于 30 秒,则继续添加线程,一旦超过 30 秒,请减少使用。有什么建议吗?

注意与本题回复相关:https://stackoverflow.com/a/20192692/896697

【问题讨论】:

    标签: c# .net multithreading parallel-processing task-parallel-library


    【解决方案1】:

    最简单的方法是调整最佳数量的并发请求和硬编码,就像您目前所做的那样,但是如果您愿意付出一些努力,还有一些更好的选择。

    您可以从 Parallel.ForEach 移动到 using a thread pool。这样,当事情从远程服务器返回时,您可以手动或以编程方式调整可用线程的数量。随着事情变慢/加速,减少/增加可用线程的数量,甚至在需要时终止它们。

    您还可以执行上述using Tasks 的变体,这是在 .net 中执行并行/异步操作的新方法。

    另一种选择是使用计时器和/或作业模型来安排每 x 毫秒的作业,然后可以根据从服务器返回的结果来限制/放松。最简单的入门方法是using Quartz.Net

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-11
      • 1970-01-01
      • 2011-10-28
      • 2021-11-29
      相关资源
      最近更新 更多