使用 Parallel.ForEach 之外的选项
Posted
技术标签:
【中文标题】使用 Parallel.ForEach 之外的选项【英文标题】:Options Besides Using Parallel.ForEach 【发布时间】:2021-03-20 23:38:06 【问题描述】:我已经构建了一个 Windows 窗体应用程序,该应用程序用于生成大约 70k s-s-rS 报告并将它们保存到一个文件夹中以供分发。这个过程大约需要 8 个小时才能运行,所以我尝试使用 Parallel.ForEach() 来加快速度。
我可以在 MaxDegreeOfParallelism 设置为 3 的情况下运行应用程序,只要没有其他进程正在访问报表服务器、高于该值的任何进程或同时访问服务器的其他进程并且报表服务器抛出 HTTP 503 错误,因为它超载了。我无法控制其他进程可以访问服务器的内容或时间,因此我担心将 MaxDegreeOfParallelism 设置为 2 可能无法防止服务器过载。
我几乎没有使用 Parallel Library 的经验,所以我会很感激任何关于我可以做什么的方向或建议,除了使用 Parallel.ForEach() 来加速这个应用程序。
【问题讨论】:
你不能只是Retry
任何导致 503 错误的请求吗?或者您担心向已经过载的服务器发送请求会使其更加过载?在这种情况下,您可以考虑结合Retry
和CircuitBreaker
机制。
【参考方案1】:
分析中的第一件事是,您的任务是处理器密集型还是 I/O 密集型,这将帮助您决定是使用 Parallel.ForEach() 进行处理器密集型处理还是使用 Task.WhenAll 之类的东西进行 I/O 密集型处理.
根据您的问题,我认为这是一个 I/O 密集型过程,但如果不能看到您的代码就很难说。
每个进程的时间是花在数据库查询、文件读/写还是实际处理器操作上?这些是您找到最佳解决方案需要回答的关键问题。
您还可以考虑使用新的语言工具,例如异步流或并行 foreach 异步
你可以在这里找到一些很好的例子:
https://scatteredcode.net/parallel-foreach-async-in-c/
【讨论】:
以上是关于使用 Parallel.ForEach 之外的选项的主要内容,如果未能解决你的问题,请参考以下文章
何时使用 Parallel.ForEach,何时使用 PLINQ