当前位置:  开发笔记 > 编程语言 > 正文

并行聚合集合

如何解决《并行聚合集合》经验,为你挑选了1个好方法。

我已经看到了基本类型的并行聚合代码,例如

Parallel.For(0, result.Count, () => 0, (i, loop, subtotal) =>
    {
        subtotal += result[i];
        return subtotal;
    },
    (x) => Interlocked.Add(ref sum, x)
);

我想知道是否有相同的列表/其他集合,例如:

List AllResults;
Parallel.ForEach(allIDs, (currentID) =>
{

    subList.add(GetResultFor(currentID));
    return subList;
},
(x) =>
{
    lock(AllResults)
        AllResults.AddRange(subList);
};

我猜测没有什么好看和整洁,但我想不出另一种做法,当然不是通过一个标准的parralel.ForEach因为我不能想到你会怎么说"这个核心有这个范围,这个核心这个范围"....



1> Yuval Itzcha..:

我认为在这两个示例中,PLINQ可以更好地为您服务,而无需在使用非线程安全集合时手动锁定.

您的总和计算可以转换为:

var sum = result.AsParallel().Sum();

而你的第二个例子List可以转换为:

List results = allIDs.AsParallel()
                             .Select(id => GetResultFor(id))
                             .ToList();

注意并行性与测试所说的一样好.并不总是会并行加速代码,有时它甚至可能会降低顺序循环的性能.

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有