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

c# – 使用Parallel.ForEach()时防止远程系统过载,第1张

概述我们已经构建了这个需要在远程机器(实际上是MatLab服务器)上完成一些计算的应用程序.我们使用Web服务连接到MatLab服务器并执行计算. 为了加快速度,我们使用Parallel.ForEach()来同时进行多个服务调用.如果我们将ParallelOptions.MaxDegreeOfParallelism(DOP)设置为4或者其他东西非常保守,那么一切都运行良好. 但是,如果我们让框架决定D 我们已经构建了这个需要在远程机器(实际上是MatLab服务器)上完成一些计算的应用程序.我们使用Web服务连接到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()时防止远程系统过载全部内容,希望文章能够帮你解决c# – 使用Parallel.ForEach()时防止远程系统过载所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/1230635.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存