使用Parallel.ForEach()时防止远程系统过载

本文关键字:程系统 系统 Parallel ForEach 使用 | 更新日期: 2023-09-27 17:53:21

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

为了加快速度,我们使用了Parallel.ForEach(),以便同时进行多个服务调用。如果我们将ParallelOptions.MaxDegreeOfParallelism (DOP)保守地设置为4或其他值,一切都会很好地工作。然而,如果我们让框架决定DOP,那么它将产生太多的线程,从而迫使远程机器陷入瘫痪,并开始出现超时(> 10分钟)。

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

注意:与此问题的回答相关:https://stackoverflow.com/a/20192692/896697

使用Parallel.ForEach()时防止远程系统过载

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

你可以从平行移动。ForEach使用线程池。这样,当从远程服务器返回信息时,您可以手动或编程地调优可用线程的数量。当事物变慢/加速时减少/增加可用线程的数量,甚至在需要时杀死它们。

你也可以使用任务来做上面的一个变体,这是在。net中进行并行/异步操作的新方法。

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