filecoin官方調(diào)度不適合拿來直接使用。
以下是本人自己的一些學(xué)習(xí)經(jīng)驗(yàn)
翻譯一下這三步囤攀。
一,遍歷每個(gè)任務(wù)膏萧。對(duì)每個(gè)任務(wù)蝌衔,選出能夠運(yùn)行它的worker(worker的資源足夠)榛泛,所有符合的worker放在一個(gè)數(shù)組中胚委。然后對(duì)這個(gè)數(shù)據(jù)排序(排序的方式按照資源多少)
二叉信,再次遍歷每個(gè)任務(wù)。選取一步驟的數(shù)組中的第一個(gè)worker。將任務(wù)分配到該worker中
三覆享,第三步重新就是將新的 內(nèi)容(任務(wù)和worker的對(duì)應(yīng)關(guān)系) 放到結(jié)構(gòu)體里营袜。
第一步:?jiǎn)⒂妹恳粋€(gè)閉包對(duì)每個(gè)任務(wù)選擇一組可以跑這個(gè)任務(wù)的woker數(shù)組。等到這些閉包完全執(zhí)行結(jié)束后荚板。acceptableWindows[sqi][...]這個(gè)二維數(shù)組存放的信息。sqi代表任務(wù)的下標(biāo)(比如第一個(gè)任務(wù)拧抖,第二個(gè)任務(wù)),[...]代表能夠接受這個(gè)任務(wù)的worker列表免绿,而且是排序好的唧席。比如說acceptableWindows[1]這個(gè)切片有兩個(gè)worker可以滿足任務(wù)1的要求嘲驾,第一個(gè)資源有百分之五十,第二個(gè)資源有百分之三十徒仓,自然是第一個(gè)排到最前面榕暇。
第二步比較簡(jiǎn)單,就是把每個(gè)任務(wù)對(duì)應(yīng)的acceptableWindows[sqi]切片取出第一個(gè)彤枢。然后進(jìn)行基本判斷”谏梗看是否滿足要求。如果第一個(gè)worker滿足要求秒咐,該任務(wù)就直接選擇這個(gè)worker了碘裕。
for _, wnd :=range acceptableWindows[task.indexHeap]? ?task.indexHeap 也就是sqi
windows[selectedWindow].todo =append(windows[selectedWindow].todo, task)?
將任務(wù)裝進(jìn)woker隊(duì)列中。
看一下對(duì)應(yīng)關(guān)系帮孔。
windows :=make([]schedWindow, windowsLen)
windows是暫時(shí)定義的一個(gè)worker列表不撑。?windowsLen就是所有worker列表的長(zhǎng)度
windowsLen :=len(sh.openWindows)??openWindows是scheduler結(jié)構(gòu)體中的worker列表
selectedWindow 圖片貼出來代碼上晤斩。是選出的該worker下標(biāo)。
有點(diǎn)繞
直接說結(jié)論澳泵。第二步驟把任務(wù)裝進(jìn)臨時(shí)建立的一個(gè)worker列表中。這個(gè)臨時(shí)建立的worker列表windows腊敲,下標(biāo)對(duì)應(yīng)著sh.openWindows下標(biāo)维苔。
第二步結(jié)束后。每一個(gè)任務(wù)蕉鸳,就能選到對(duì)應(yīng)的worker(臨時(shí)的列表)
其他情況:有些任務(wù)在選擇過程中,所有worker都沒辦法滿足潮尝,只能說留在循環(huán)隊(duì)列里。能重新分配的任務(wù)羹蚣。就把它從任務(wù)隊(duì)列里刪掉乱凿。
if len(rmQueue) >0 {for i :=len(rmQueue) -1; i >=0; i-- {sh.schedQueue.Remove(rmQueue[i])}}
第三步:
第三步有兩個(gè)小步驟:
首先將遍歷一下臨時(shí)列表windows
如果windows后面的任務(wù)列表為空。跳過
for wnd, window :=range windows {
if len(window.todo) ==0 {
// Nothing scheduled here, keep the window open
? ? ? continue
? }
然后將有內(nèi)容的wndow 存進(jìn)openwindow里邊徒蟆。
select {
case sh.openWindows[wnd].done <- &window:
default:
log.Error("expected sh.openWindows[wnd].done to be buffered")
}
第二步。從新寫一遍sh.openWindows??
for wnd, window :=range sh.openWindows {
if _, scheduled := scheduledWindows[wnd]; scheduled {
// keep unscheduled windows open
? ? ? continue
? }
newOpenWindows =append(newOpenWindows, window)
}
sh.openWindows = newOpenWindows
第三步結(jié)束后全蝶。又是一個(gè)全新的sh.openWindows? 調(diào)度結(jié)束寺枉。
官方寫得很復(fù)雜。原因在于各種下標(biāo)的對(duì)應(yīng)關(guān)系姥闪。且不實(shí)用。
如果我們對(duì)某個(gè)機(jī)型跑多少任務(wù)的筐喳,怎么跑法比較熟悉往弓。比如說一臺(tái)機(jī)器蓄氧。跑幾個(gè)進(jìn)程槐脏,cg怎么綁定資源。就可以根據(jù)經(jīng)驗(yàn)加任務(wù)顿天。