filecoin官方调度不适合拿来直接使用。
以下是本人自己的一些学习经验

翻译一下这三步。
一,遍历每个任务。对每个任务,选出能够运行它的worker(worker的资源足够),所有符合的worker放在一个数组中。然后对这个数据排序(排序的方式按照资源多少)
二,再次遍历每个任务。选取一步骤的数组中的第一个worker。将任务分配到该worker中
三,第三步重新就是将新的 内容(任务和worker的对应关系) 放到结构体里。
第一步:启用每一个闭包对每个任务选择一组可以跑这个任务的woker数组。等到这些闭包完全执行结束后。acceptableWindows[sqi][...]这个二维数组存放的信息。sqi代表任务的下标(比如第一个任务,第二个任务),[...]代表能够接受这个任务的worker列表,而且是排序好的。比如说acceptableWindows[1]这个切片有两个worker可以满足任务1的要求,第一个资源有百分之五十,第二个资源有百分之三十,自然是第一个排到最前面。

第二步比较简单,就是把每个任务对应的acceptableWindows[sqi]切片取出第一个。然后进行基本判断。看是否满足要求。如果第一个worker满足要求,该任务就直接选择这个worker了。
for _, wnd :=range acceptableWindows[task.indexHeap] task.indexHeap 也就是sqi

windows[selectedWindow].todo =append(windows[selectedWindow].todo, task)
将任务装进woker队列中。
看一下对应关系。
windows :=make([]schedWindow, windowsLen)
windows是暂时定义的一个worker列表。 windowsLen就是所有worker列表的长度
windowsLen :=len(sh.openWindows) openWindows是scheduler结构体中的worker列表
selectedWindow 图片贴出来代码上。是选出的该worker下标。
有点绕
直接说结论。第二步骤把任务装进临时建立的一个worker列表中。这个临时建立的worker列表windows,下标对应着sh.openWindows下标。
第二步结束后。每一个任务,就能选到对应的worker(临时的列表)
其他情况:有些任务在选择过程中,所有worker都没办法满足,只能说留在循环队列里。能重新分配的任务。就把它从任务队列里删掉。
if len(rmQueue) >0 {for i :=len(rmQueue) -1; i >=0; i-- {sh.schedQueue.Remove(rmQueue[i])}}
第三步:

第三步有两个小步骤:
首先将遍历一下临时列表windows
如果windows后面的任务列表为空。跳过
for wnd, window :=range windows {
if len(window.todo) ==0 {
// Nothing scheduled here, keep the window open
continue
}
然后将有内容的wndow 存进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
第三步结束后。又是一个全新的sh.openWindows 调度结束。
官方写得很复杂。原因在于各种下标的对应关系。且不实用。
如果我们对某个机型跑多少任务的,怎么跑法比较熟悉。比如说一台机器。跑几个进程,cg怎么绑定资源。就可以根据经验加任务。