golang浠诲姟璋冨害妗嗘灦鎬庝箞瀹炵幇
瑕佸疄鐜颁竴涓狦olang浠诲姟璋冨害妗嗘灦锛屽彲浠ユ寜鐓т互涓嬫楠よ繘琛岋細
- 瀹氫箟浠诲姟缁撴瀯浣擄細棣栧厛锛屽畾涔変竴涓换鍔$粨鏋勪綋锛屽寘鍚换鍔$殑灞炴€э紝渚嬪浠诲姟鐨処D銆佸悕绉般€佹墽琛屾椂闂淬€佹墽琛屽懆鏈熺瓑绛夈€?/li>
type Task struct {
ID int
Name string
Time time.Time
Interval time.Duration
}
- 鍒涘缓浠诲姟璋冨害鍣細鍒涘缓涓€涓换鍔¤皟搴﹀櫒缁撴瀯浣擄紝鐢ㄤ簬绠$悊鎵€鏈夌殑浠诲姟銆?/li>
type Scheduler struct {
tasks []*Task
}
- 娣诲姞浠诲姟锛氭彁渚涗竴涓柟娉曪紝鍏佽鐢ㄦ埛鍚戣皟搴﹀櫒涓坊鍔犱换鍔°€?/li>
func (s *Scheduler) AddTask(task *Task) {
s.tasks = append(s.tasks, task)
}
- 鍚姩璋冨害鍣細鍒涘缓涓€涓柟娉曪紝鐢ㄤ簬鍚姩浠诲姟璋冨害鍣ㄣ€傝繖涓柟娉曚細鎸夌収浠诲姟鐨勬墽琛屾椂闂村拰鍛ㄦ湡锛屽畾鏃舵墽琛屼换鍔°€?/li>
func (s *Scheduler) Start() {
for {
for _, task := range s.tasks {
if time.Now().After(task.Time) {
go func(t *Task) {
// 鎵ц浠诲姟鐨勯€昏緫
// ...
}(task)
if task.Interval > 0 {
task.Time = time.Now().Add(task.Interval)
} else {
// 濡傛灉浠诲姟涓嶆槸鍛ㄦ湡鎬ф墽琛岀殑锛屼粠璋冨害鍣ㄤ腑绉婚櫎璇ヤ换鍔?/span>
s.RemoveTask(task)
}
}
}
time.Sleep(1 * time.Second)
}
}
- 绉婚櫎浠诲姟锛氭彁渚涗竴涓柟娉曪紝鍏佽鐢ㄦ埛浠庤皟搴﹀櫒涓Щ闄ゆ煇涓换鍔°€?/li>
func (s *Scheduler) RemoveTask(task *Task) {
for i, t := range s.tasks {
if t.ID == task.ID {
s.tasks = append(s.tasks[:i], s.tasks[i+1:]...)
break
}
}
}
- 浣跨敤绀轰緥锛?/li>
func main() {
scheduler := &Scheduler{}
// 娣诲姞浠诲姟
task1 := &Task{
ID: 1,
Name: "task1",
Time: time.Now().Add(5 * time.Second), // 5绉掑悗鎵ц
Interval: 0, // 鍙墽琛屼竴娆?/span>
}
scheduler.AddTask(task1)
task2 := &Task{
ID: 2,
Name: "task2",
Time: time.Now().Add(10 * time.Second), // 10绉掑悗鎵ц
Interval: 2 * time.Second, // 姣?绉掓墽琛屼竴娆?/span>
}
scheduler.AddTask(task2)
// 鍚姩璋冨害鍣?/span>
scheduler.Start()
}
浠ヤ笂灏辨槸涓€涓畝鍗曠殑Golang浠诲姟璋冨害妗嗘灦鐨勫疄鐜般€傛牴鎹疄闄呴渶姹傦紝鍙互杩涜鏇村鏉傜殑鎵╁睍锛屼緥濡傚鍔犱换鍔$殑浼樺厛绾с€佷换鍔$殑骞跺彂鎺у埗绛夊姛鑳姐€?/p>
相关问答