并發(fā)任務(wù)調(diào)度是一種將多個任務(wù)并行執(zhí)行的技術(shù),可以提高程序的執(zhí)行效率。Go語言中提供了一個很方便的并發(fā)控制工具——WaitGroup,可以用來構(gòu)建任務(wù)調(diào)度引擎。
WaitGroup是一個計數(shù)器,用來等待一組任務(wù)的結(jié)束。當(dāng)我們啟動一個任務(wù)時,可以調(diào)用WaitGroup的Add方法來增加計數(shù)器的值,當(dāng)任務(wù)結(jié)束時,可以調(diào)用Done方法來減少計數(shù)器的值。主線程可以通過調(diào)用Wait方法來阻塞,直到計數(shù)器的值變?yōu)?,即所有任務(wù)都結(jié)束。
下面是一個簡單的示例,演示如何使用WaitGroup構(gòu)建任務(wù)調(diào)度引擎:
package main
import (
"fmt"
"sync"
"time"
)
func main() {
var wg sync.WaitGroup
// 啟動10個任務(wù)
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) // 模擬任務(wù)執(zhí)行時間
fmt.Printf("Task %d done\n", id)
}(i)
}
// 等待所有任務(wù)完成
wg.Wait()
fmt.Println("All tasks done")
}
在上面的示例中,我們創(chuàng)建了一個WaitGroup變量wg。然后,我們啟動了10個任務(wù),每個任務(wù)都會調(diào)用wg.Add(1)來增加計數(shù)器的值,表示有一個任務(wù)正在執(zhí)行。任務(wù)的實現(xiàn)是一個匿名函數(shù),它會打印任務(wù)的開始和結(jié)束信息,并模擬任務(wù)執(zhí)行時間。在任務(wù)結(jié)束時,我們調(diào)用wg.Done()來減少計數(shù)器的值,表示一個任務(wù)已經(jīng)完成。
最后,我們調(diào)用wg.Wait()來阻塞主線程,直到計數(shù)器的值變?yōu)?,即所有任務(wù)都完成。在所有任務(wù)完成后,我們打印出"All tasks done"。
通過使用WaitGroup,我們可以方便地構(gòu)建任務(wù)調(diào)度引擎,實現(xiàn)并發(fā)任務(wù)的調(diào)度和控制。在實際應(yīng)用中,可以根據(jù)實際需求對任務(wù)進(jìn)行更復(fù)雜的控制,例如設(shè)置最大并發(fā)數(shù)、任務(wù)優(yōu)先級等。