任務排程的並行演算法

jeanron100發表於2018-04-03

如果給定一批任務,比如有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

明顯好很多。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-2152537/,如需轉載,請註明出處,否則將追究法律責任。

相關文章