溫馨提示×

golang異步任務隊列怎么實現(xiàn)

小億
140
2023-10-26 19:49:05
欄目: 編程語言

在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)了一個簡單的異步任務隊列。

0