【问题标题】:What's the best way of achieving a parallel infinite Loop?实现并行无限循环的最佳方法是什么?
【发布时间】:2011-12-29 18:26:55
【问题描述】:

我已经习惯在 .Net 的并行扩展中使用 Parallel.For(),因为它是一种并行化代码的简单方法,无需手动启动和维护线程(这可能很繁琐)。我现在正在查看我希望并行化的无限循环(做某事直到我发出信号停止),没有一个参数免费的 Parallel.For() 重载可以做到这一点,所以想知道这里最好的方法是什么是。原则上我可以这样做:

Parallel.For(0, int.Max)

但我怀疑这可能不是工作分区逻辑处理的预期/有效模式(?)

另一个选项是这样的:

for(;;)
{
    Parallel.For(0, 128, delegate()
    {
       // Do stuff.
    }
}

但这似乎不优雅,也可能导致工作划分效率低下。

现在我的直觉是通过创建和维护我自己的线程来手动执行此操作,但我有兴趣获得一些反馈/意见。谢谢。

=== 更新 ===

我正在使用已接受答案中文章中代码的简化版本(我已删除 ParallelOptions 参数)。这是代码...

public class ParallelUtils
{
    public static void While(Func<bool> condition, Action body) 
    { 
        Parallel.ForEach(IterateUntilFalse(condition), ignored => body()); 
    }

    private static IEnumerable<bool> IterateUntilFalse(Func<bool> condition) 
    { 
        while (condition()) yield return true; 
    }
}

一个示例用法是:

Func<bool> whileCondFn = () => !_requestStopFlag;
ParallelUtils.While(whileCondFn, delegate()
{
    // Do stuff.


});

【问题讨论】:

  • 有没有可以使用的线程模型

标签: c# .net parallel-processing parallel-extensions parallel-for


【解决方案1】:

Stephen Toub 有一篇关于 Implementing Parallel While with Parallel.ForEach 的帖子。

【讨论】:

  • Stephen Toub 的帖子对于像我这样的菜鸟来说是相当先进的。非常感谢最佳/推荐方法的简单示例用法。
  • 这是评论还是答案?
  • 链接失效
【解决方案2】:

如果您(真的)想要无限的东西,那么您希望它在尽可能少的核心上。 Parallel.For___ 都不是一个好的选择。

您(可能)需要的是一个单独的线程或使用 LongRunning 选项创建的任务。

然后让它在信号量上等待,或者作为最后的手段,尽可能频繁地调用 Sleep()。

【讨论】:

  • 这个问题的背景是它是一个数据挖掘项目。我正在获取当前无限期运行的数据分析代码(例如,运行一整夜,然后发出信号在第二天早上停止)并将其耕种到多个线程,因此我确实希望它在所有内核上无限期地运行。
  • @locster - 拥有一个主“无限”线程,为其工作创建子线程。
【解决方案3】:

考虑到它是无限微积分请求,但您需要在每个“循环”上都有一些有限状态,我会说我会使用外部 for(;;) 循环更改解决方案来执行 Parallel.ForEach(...) 调用某些事件/状态更改。比如Monitor 信号、event 通知,或者类似的东西......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-21
    • 2021-08-24
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 2019-11-20
    相关资源
    最近更新 更多