zoukankan      html  css  js  c++  java
  • Parallel中分区器Partitioner的简单使用

    Partitioner.Create(1,10,4).GetDynamicPartitions()
    为长度为10的序列创建分区,每个分区至多4个元素,分区方法及结果:Partitioner.Create(0, 10, 4).GetDynamicPartitions()
    得到3个前闭后开区间: [0, 4)即{0, 1, 2, 3}, [4, 8)即{4, 5, 6, 7}, [8, 10)即{8, 9},  注意被枚举的数字均为数组下标
     
    为长度为10的序列创建分区,至多4个分区,分区方法及结果: Partitioner.Create(0, 10, 3).GetDynamicPartitions()
    得到4个前闭后开区间: [0,3)即{0, 1, 2}, [3, 6)即{3, 4, 5}, [6, 9)即{6, 7, 8}, [9, 10)即{9}, 注意被枚举的数字均为数组下标
     
    定义分区个数 = 定义并发线程(笔者这样讲并不严格), 故定义方法如下:
    private static void NewMethod<T>(IList<T> array, Int32 rangeCount) {
        var rangeSize = (Int32)Math.Ceiling(array.Count / (Double)rangeCount);
        var part = Partitioner.Create(0, array.Count, rangeSize);
        Parallel.ForEach(part, (range, state, rangeIndex) => {
            for (Int32 index = range.Item1; index < range.Item2; index++) {
                Console.WriteLine("[{0,2}] {1} {2}", Thread.CurrentThread.ManagedThreadId, rangeIndex, index);
            }
        });
    }
     
    对于分区个数定义为3, 可以看到线程ID 在1,3,4中切换, 线程[1]遍历了4个元素, 线程[3]遍历了4个元素, 线程[4]遍历了2个元素
     
    对于分区个数定义为4, 可以看到线程ID 在1, 3, 4, 5中切换, 线程[1]遍历了3个元素, 线程[3]遍历了3个元素, 线程[4]遍历了3个元素, 线程5遍历了1个元素.
  • 相关阅读:
    7-1 城市间紧急救援 (25 分)(最短路径:斯特拉算法)
    常见的MD5碰撞
    PHP常见绕过(更新ing)
    7-10 旅游规划 (25 分)
    杂记:用python向网页提交数据
    python学习日记
    NOIP2018提高组金牌训练营——搜索专题
    noip复习之拓扑排序
    NOIP2018提高组金牌训练营——字符串专题
    NOIP2018提高组金牌训练营——数论专题
  • 原文地址:https://www.cnblogs.com/Jusfr/p/3758055.html
Copyright © 2011-2022 走看看