基於DAG簡單的任務排程

2021-10-02 02:50:10 字數 2661 閱讀 4883

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的啟動類上加上 ...