中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

golang怎么控制并發數

小億
153
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
崇左市| 巴楚县| 南和县| 青川县| 西盟| 利川市| 江永县| 洪洞县| 枣庄市| 长乐市| 靖江市| 天津市| 阳东县| 高唐县| 大英县| 保定市| 旺苍县| 东城区| 清远市| 巫山县| 辉南县| 石首市| 阜城县| 清新县| 禹州市| 中牟县| 上杭县| 喀什市| 通州区| 嘉禾县| 阳信县| 福安市| 西乌| 洱源县| 全州县| 古丈县| 樟树市| 闻喜县| 榕江县| 宜兴市| 卓尼县|