并發任務調度是一種將多個任務并行執行的技術,可以提高程序的執行效率。Go語言中提供了一個很方便的并發控制工具——WaitGroup,可以用來構建任務調度引擎。
WaitGroup是一個計數器,用來等待一組任務的結束。當我們啟動一個任務時,可以調用WaitGroup的Add方法來增加計數器的值,當任務結束時,可以調用Done方法來減少計數器的值。主線程可以通過調用Wait方法來阻塞,直到計數器的值變為0,即所有任務都結束。
下面是一個簡單的示例,演示如何使用WaitGroup構建任務調度引擎:
package main
import (
"fmt"
"sync"
"time"
)
func main() {
var wg sync.WaitGroup
// 啟動10個任務
for i := 0; i < 10; i++ {
wg.Add(1)
go func(id int) {
defer wg.Done()
fmt.Printf("Task %d starting\n", id)
time.Sleep(1 * time.Second) // 模擬任務執行時間
fmt.Printf("Task %d done\n", id)
}(i)
}
// 等待所有任務完成
wg.Wait()
fmt.Println("All tasks done")
}
在上面的示例中,我們創建了一個WaitGroup變量wg。然后,我們啟動了10個任務,每個任務都會調用wg.Add(1)來增加計數器的值,表示有一個任務正在執行。任務的實現是一個匿名函數,它會打印任務的開始和結束信息,并模擬任務執行時間。在任務結束時,我們調用wg.Done()來減少計數器的值,表示一個任務已經完成。
最后,我們調用wg.Wait()來阻塞主線程,直到計數器的值變為0,即所有任務都完成。在所有任務完成后,我們打印出"All tasks done"。
通過使用WaitGroup,我們可以方便地構建任務調度引擎,實現并發任務的調度和控制。在實際應用中,可以根據實際需求對任務進行更復雜的控制,例如設置最大并發數、任務優先級等。