【问题标题】:parallel.for or task.startnew in multithreading process多线程进程中的 parallel.for 或 task.startnew
【发布时间】:2012-03-22 17:26:14
【问题描述】:

我有一个字符串列表,我需要将其传递给不同类中的进程。我想知道这两种想法中的哪一种在速度、效率和并行处理方面更适合使用。该列表包含 +- 10000 个字符串,我想适当地限制线程一次只运行大约 5 个线程:

For i as integer = 0 to searchPages.Count - 1
    Parallel.For(0,10,Sub(x)
                        ps.processPage(searchPages.Item(i))
                 End Sub)
Next

任务工厂似乎工作正常,但不确定要实现哪个。

For i as integer = 0 to searchPages.Count - 1
    Dim fact as Task=Task.Factory.StartNew(Sub() ps.processPage(searchPages.Item(i)))
    If i = 11 then
           Tasks.Task.WaitAll()
    Endif

Next

任何想法表示赞赏。

【问题讨论】:

    标签: .net vb.net visual-studio-2010 task-parallel-library taskfactory


    【解决方案1】:

    对于这种类型的纯数据并行,我建议使用Parallel.ForEach

    Parallel.ForEach(searchPages, Sub(page) ps.processPage(page))
    

    如果你想限制它使用 5 个线程,你可以通过 ParallelOptions.MaxDegreeOfParallelism 做到这一点:

    Dim po as New ParallelOptions
    po.MaxDegreeOfParallelism = 5
    Parallel.ForEach(searchPages, po, Sub(page) ps.processPage(page))
    

    这将比Task.Factory.StartNew 减少开销,因为Parallel 类中的分区将重用任务,并防止发生过度调度。它还将使用当前线程进行一些处理,而不是强制它进入等待状态,这也将减少所涉及的总开销。

    【讨论】:

      【解决方案2】:

      如果我是你,我不会太担心正在使用多少线程(除非你能证明这是个问题)。只需使用 Parallel.ForEach 并让运行时计算出最佳线程数。

      查看this 问题的答案,了解有关运行时如何为您管理线程的一些详细信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-07
        • 2022-11-02
        • 1970-01-01
        • 1970-01-01
        • 2012-10-15
        • 2015-08-11
        • 1970-01-01
        相关资源
        最近更新 更多