我们构建了这个需要在远程机器(实际上是 MatLab 服务器)上完成一些计算的应用程序。我们使用网络服务连接到 MatLab 服务器并执行计算。
为了加快处理速度,我们使用了 Parallel.ForEach()
以便同时进行多个服务调用。如果我们在将 ParallelOptions.MaxDegreeOfParallelism
(DOP) 设置为 4 或其他值时非常保守,则一切正常。
然而,如果我们让框架决定 DOP,它会产生如此多的线程,迫使远程机器跪下并开始发生超时(> 10 分钟)。
我们如何解决这个问题?我希望能够做的是使用响应时间来限制调用。如果响应时间小于 30 秒,继续添加线程,一旦超过 30 秒,就减少使用。有什么建议吗?
注意与此问题中的响应相关:https://stackoverflow.com/a/20192692/896697
最佳答案
最简单的方法是调整最佳数量的并发请求和硬编码,就像您目前所做的那样,但是如果您愿意付出一些努力,还有一些更好的选择。
您可以从 Parallel.ForEach 移动到 using a thread pool .这样,当事情从远程服务器返回时,您可以手动或以编程方式调整可用线程的数量。随着事情变慢/加速,减少/增加可用线程的数量,甚至在需要时杀死它们。
您还可以对上述 using Tasks 做一个变体这是在 .net 中执行并行/异步操作的较新方法。
另一种选择是使用计时器和/或作业模型每 x 毫秒安排一次作业,然后可以根据服务器返回的结果来限制/放宽作业。最简单的入门方法是 using Quartz.Net .
关于c# - 使用 Parallel.ForEach() 时防止远程系统过载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22656669/