如果給定一批任務,比如有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
明顯好很多。