使用 MaxDegreeOfParallism 进行并行 foreach,有时会在两者之间停止进程
Posted
技术标签:
【中文标题】使用 MaxDegreeOfParallism 进行并行 foreach,有时会在两者之间停止进程【英文标题】:Used MaxDegreeOfParallism for parallel foreach, sometimes stops process in between 【发布时间】:2021-01-10 15:58:21 【问题描述】:我在Parallel.ForEach
和MaxDegreeOfParallism = 3
中运行了一个长时间运行的进程。有时我的过程会在两者之间停止。
例如,有 150 个文档需要处理,在 100 个成功的文档处理后停止。这可以是其他用户并行点击应用程序并且需要内存吗?如果有任何内存问题,IIS 会自动终止进程吗?这是因为内存问题吗?看起来服务器有内存。
请提出建议。
【问题讨论】:
你捕获并记录异常吗?Parallel.ForEach
意味着通过对数据进行分区并将每个分区提供给工作任务来使用所有可用内核来处理大量数据。它不用于异步操作或一次启动大量任务。至于 ASP.NET 终止长时间操作,是的,这是默认行为和是一件好事。否则一个错误很容易导致服务器死机,例如无限循环
这里有两个问题 - 如何在 ASP.NET 或 ASP.NET Core 中执行长任务,以及如何处理大量文档。发布您真正想做的事情,而不是您认为可以解决的方式。
对于 ASP.NET 中长时间运行的任务,请查看 Scott Hanselman 的 How to run background tasks in ASP.NET。 ASP.NET Core 使用 BackgroundService 使简单的情况变得更容易,但如果您需要创建多种类型的后台作业,像 Hangfire 或 Coravel 这样的选项会更好
除此之外,您还必须解释您真正想要做什么。您可以创建一个作业来处理一个大列表中的文档,一次 3 个,例如使用 ActionBlock。或者,您可以创建一个队列,在文档发布时接收它们并在后台处理它们。也许这项工作需要轮询一些文件来源?还是不行?
【参考方案1】:
我使用hangfire 来解决这个问题。 https://www.hangfire.io/
【讨论】:
以上是关于使用 MaxDegreeOfParallism 进行并行 foreach,有时会在两者之间停止进程的主要内容,如果未能解决你的问题,请参考以下文章