在Go語言中,可以使用goroutine和channel來實現(xiàn)異步任務隊列。下面是一個簡單的示例代碼:
package main
import (
"fmt"
"sync"
"time"
)
func main() {
// 創(chuàng)建一個無緩沖的channel,用于任務隊列
taskQueue := make(chan func())
// 使用sync.WaitGroup來等待所有任務完成
var wg sync.WaitGroup
// 啟動消費者goroutine,不斷從任務隊列中取出任務并執(zhí)行
go func() {
for task := range taskQueue {
task()
wg.Done()
}
}()
// 添加一些任務到任務隊列
for i := 0; i < 10; i++ {
// 增加等待的任務數(shù)量
wg.Add(1)
// 創(chuàng)建一個任務,并將其添加到任務隊列
task := func() {
fmt.Println("執(zhí)行任務", i)
time.Sleep(1 * time.Second) // 模擬任務執(zhí)行時間
}
taskQueue <- task
}
// 等待所有任務完成
wg.Wait()
// 關閉任務隊列
close(taskQueue)
fmt.Println("所有任務已完成")
}
在上面的示例代碼中,我們創(chuàng)建了一個無緩沖的channel taskQueue
作為任務隊列,通過 taskQueue <- task
將任務添加到隊列中。然后,我們啟動一個消費者goroutine來不斷從任務隊列中取出任務并執(zhí)行,直到任務隊列被關閉。
通過使用sync.WaitGroup
來等待所有任務完成,我們可以確保在所有任務執(zhí)行完之前,程序不會退出。當所有任務都完成后,我們關閉任務隊列并結(jié)束程序。
這樣,我們就實現(xiàn)了一個簡單的異步任務隊列。