如果给定一批任务,比如有500个任务,需要在尽可能快的时间内做完。
如果串行是肯定不行的。我们可以考虑并行策略,但是开了并行,怎么能够充分利用资源比较好呢。
这个问题在多年前做数据迁移的时候,逼得没办法,当时用shell写了一个算法,可以参考这一篇。
海量数据迁移之使用shell启用多个动态并行(r2笔记81天)
但是在自动化运维平台中,我希望这个操作能够更加通用,所以在程序端实现是极好的。
我先打算用Java来实现,然后转义为Python版本,已经写了大半部分,还没有调试好,就先不放出来了,我把我的思路说一下。
假设有下面的一些任务,第一位是序号,第二位是任务需要花费的时间。
假设分为4个并行,即4组执行任务,每组执行任务该如何分配呢。
(1, 10),
(2, 30),
(3, 20),
(4, 50),
(5, 60),
(6, 30),
(7, 20),
(8, 10),
(9, 20),
(10,50),
所以放眼任务调度的方向上,我们都希望并行,但是绝大多数情况下,并行的效果其实不好,一种最重建的情况就是前半段在并行,后半段基本在等待。
假设我们按照如下的思路来完成,前四个元素是每组的一个元素,然后每组查看累计值的最小值,然后依次加入后续的元素。按照这种方法,得到的任务安排如下:
1 10 60 70
2 30 20 20 70
3 20 30 50 100
4 50 10 60
明显这种方法有缺点,因为我们无法预知后续元素的大小,所以任务分配很不均匀。
所以我们需要排序,按照最大值,最小值的方式排序。
这样一来,最大的4个元素分别位列每组的第一个元素。然后依次取得每组累计值的最小值,加入后续的元素。
分配情况如下:
1 50 20 70
2 60 20 80
3 50 20 10 80
4 30 30 10 70
明显好很多。