【发布时间】:2016-09-12 04:57:35
【问题描述】:
我有一个使用 TPL 并行化的 for 循环实现。我正在使用具有 4GB RAM 和 i3 Core 处理器的戴尔笔记本电脑。我有多个parallel.foreach 使用Parallel.invoke 调用。该程序是 Enterprise Architect 的插件,用于在 EA 中创建模型图和对象。
代码是这样的:
Parallel.invoke(()=>parent1Creation(),()=>parent2Creation(),...);
每个父创建都是Parallel.foreach:
Parallel.foreach(parents, (parent) => {
//create parent
//create children
for(child in parent.children) {
childecreation();
}
for(child2 in parent.children) {
childecreation();
}
//can be any type and number of children
}
我有一个问题,当我的循环大小增加时,即大约 1500-2000 次迭代,Enterprise Architect 停止工作。
这是因为我的笔记本电脑配置或我使用并行循环的方式或与企业架构师一起出现的问题吗?
我该如何解决。
【问题讨论】:
-
“并行化”它的原因是什么?它是 cpu-bound 并且
childecreation()线程安全吗? -
并行化并行任务!不要调用,或者不要并行 foreach。
-
嗨子创建是线程安全的,父创建也是相互独立的。现在完整的执行需要 12 个小时。由于我的循环有大约 1k 次或更多次迭代,而且子创建也可能是一个大循环。我正在尝试减少创建时间。使用多线程或任何其他方式实现它的最佳方法是什么。
-
未并行化的代码版本是否也会发生同样的事情?你能调试一下代码,看看 EA 停止工作时它在做什么吗?
-
与其问为什么您对问题的解决方案(我们不知道)不起作用,不如解释您要解决的问题。那么我们也许可以提出不会遇到同样问题的替代解决方案。
标签: c# multithreading foreach task-parallel-library enterprise-architect