dag:是乙個無迴路的有向圖。乙個經典的應用是用於任務的排程,用來定義任務的依賴關係和流向, 根據整個dag的定義,可以從中獲取哪個任務該先執行,哪個任務後執行。哪些步驟是可以並行執行的。
這裡闡述乙個簡單的應用例子。推薦系統的通常需要進行多佇列召回,然後進行粗排、精排、混排。可以將這些操作抽象成不同型別的rpc呼叫,在資料召回之後,還可以抽象出來兩種動作,包括一種是歸併截斷、一種是切割分段。有點map-reduce的味道。
定義字段可以如下:
欄位名字段型別
字段含義
task_id
int任務id
task_name
string
任務名task_type
int任務型別
task_deps
int依賴任務列表
output
map輸出結果
output_type
int輸出型別
實際上由於業務的複雜性,output的定義會更加複雜一點,這裡相當於是簡化了。然後將上面的字段轉化成json配置檔案,即可完成dag任務圖的配置定義。
這裡沒有定義輸出字段,所有的節點的入度應該是這個node的任務的輸入資料,因為業務的複雜性,可以使用反射機制來定義輸出字段。
)// 任務附加資訊
type taskinfo struct
// 任務節點資訊
type tasknode struct
// 定義任務依賴和任務的本身的資訊
func newnode(taskinfo taskinfo, deps int) *tasknode
return tasknode
}type taskgraph struct
func (taskgraph taskgraph) new() taskgraph
if taskgraph.todo == nil
return taskgraph
}func (taskgraph *taskgraph) addtask(taskinfo taskinfo, deps int) bool
tasknode := newnode(taskinfo, deps)
taskgraph.graph[taskinfo.taskid] = tasknode
return true
}func (taskgraph *taskgraph) initgraph() bool
destiter.inedge[taskid] = false
destiter.incounter += 1
} tmpoutcounter[taskid] = node.outcounter
if node.outcounter == 0
} topcount := 0
for topstack.len() > 0
} }if topcount != len(graph)
for iter, node := range graph
} return true
}func (taskgraph *taskgraph) gettodotasks() int
return todo
}func (taskgraph *taskgraph) marktaskdone(taskid int) bool
taskgraph.todo.remove(taskid)
node := taskgraph.graph[taskid]
node.done = true
for k := range node.inedge
} for k := range node.outedge
return true
}func (taskgraph *taskgraph) dotask(taskid int) else if node.taskinfo.tasktype == 1 else if node.taskinfo.tasktype == 2
}func (taskgraph *taskgraph) taskschedule()
wg := sync.waitgroup{}
wg.add(len(todo))
for i := 0; i < len(todo); i++ (todo[i])
} for i := 0; i < len(todo); i++
} }}func (taskgraph *taskgraph) printgraph() else
fmt.println("(當前)依賴這些任務:")
for taskname, v := range node.outedge
} fmt.println()
fmt.println("(當前)被這些任務依賴:")
for taskname, v := range node.inedge
} fmt.println()
} fmt.println("-----------------------------------")
}
SpringTask任務排程基於註解
企業級應用中,經常會制定一些 計畫任務 即在某個時間點做某件事情,核心是以時間為關注點,即在乙個特定的時間點,系統執行指定的乙個操作。電商專案中運用也比較廣泛,比如對一些秒殺商品的定時清理,從一定程度上減少了快取以及資料庫的壓力.常見的任務排程框架有quartz和springtask等。xmlns ...
Quartz任務排程的簡單應用
public class remindjob implements job override public void execute jobexecutioncontext arg0 throws jobexecutionexception crontrigger mycrontrigger b 0...
Spring Boot任務排程簡單入門
本文將講解使用springboot來進行任務排程,很簡單的乙個步驟 1.首先我們在專案下面新建乙個類,為了更方面的閱讀我們新建乙個包為task下面新建乙個xxscheduledtasks的類 2.然後在裡面編寫你要排程的方法,在方法上加上 scheduled的註解,在啟動spring的啟動類上加上 ...