溫馨提示×

golang怎么控制并發數

小億
188
2023-10-21 15:12:40
欄目: 編程語言

在Go中,可以使用goroutine和channel來控制并發數。

首先,可以使用make函數創建一個帶有指定并發數的channel。例如,如果要控制并發數為10,可以創建一個大小為10的無緩沖channel:

concurrency := 10
ch := make(chan struct{}, concurrency)

然后,在需要控制并發的地方,在執行每個任務之前,可以向channel發送一個空的struct{}值來占用一個并發槽,表示一個并發任務的啟動。當任務完成后,從channel接收一個值來釋放一個并發槽。

ch <- struct{}{} // 占用一個并發槽
go func() {
    defer func() { <-ch }() // 釋放一個并發槽
    // 執行并發任務的代碼
}()

這樣就能夠通過控制channel的發送和接收來控制并發數了。

完整示例代碼如下:

package main

import (
    "fmt"
    "time"
)

func main() {
    concurrency := 10
    ch := make(chan struct{}, concurrency)

    tasks := []string{"task1", "task2", "task3", "task4", "task5", "task6", "task7", "task8", "task9", "task10"}

    for _, task := range tasks {
        ch <- struct{}{} // 占用一個并發槽
        go func(t string) {
            defer func() { <-ch }() // 釋放一個并發槽
            fmt.Printf("開始執行任務:%s\n", t)
            time.Sleep(time.Second) // 模擬任務的耗時
            fmt.Printf("任務:%s 執行完成\n", t)
        }(task)
    }

    // 等待所有任務完成
    for i := 0; i < concurrency; i++ {
        ch <- struct{}{}
    }
}

在上面的示例中,我們創建了一個包含10個并發槽的channel,然后使用goroutine來執行任務。在每個任務開始和結束時,我們輸出相應的日志。最后,我們使用一個for循環來等待所有任務完成。

注意,為了確保所有的goroutine都能夠執行完畢,我們在最后的for循環中再次向channel發送了10個空的struct{}值,以確保釋放所有的并發槽。

這樣就能夠通過channel來控制并發數了。

0
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女