golang使用有緩沖通道控制并發(fā)數(shù)

在 Go 語言中,使用帶緩沖的通道(buffered channels)可以有效地控制并發(fā)數(shù)。帶緩沖的通道可以讓你限制同時運行的 goroutine 數(shù)量,從而避免過度并發(fā)導(dǎo)致的資源耗盡問題。以下是一個使用帶緩沖通道控制并發(fā)數(shù)的示例:

package main

import (
    "fmt"
    "sync"
    "time"
)

func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
    defer wg.Done()

    // 請求一個資源
    sem <- struct{}{}

    // 模擬耗時操作
    fmt.Printf("Worker %d started\n", id)
    time.Sleep(2 * time.Second)
    fmt.Printf("Worker %d finished\n", id)

    // 釋放一個資源
    <-sem
}

func main() {
    // 定義最大并發(fā)數(shù)
    const maxConcurrency = 3

    // 創(chuàng)建帶緩沖的通道,用于限制并發(fā)數(shù)
    sem := make(chan struct{}, maxConcurrency)

    // 使用 sync.WaitGroup 等待所有 goroutine 完成
    var wg sync.WaitGroup

    // 啟動 10 個 worker
    for i := 1; i <= 10; i++ {
        wg.Add(1)
        go worker(i, sem, &wg)
    }

    // 等待所有 worker 完成
    wg.Wait()
}

在這個示例中,我們創(chuàng)建了一個帶緩沖的通道 sem,并將其緩沖大小設(shè)置為最大并發(fā)數(shù)。我們使用了一個 sync.WaitGroup 實例來等待所有 goroutine 完成。當(dāng) worker 開始執(zhí)行時,它會向通道發(fā)送一個空結(jié)構(gòu)體,從而請求一個資源。如果通道已滿,worker 將會阻塞,直到有可用資源。

當(dāng) worker 完成任務(wù)后,它會從通道接收一個空結(jié)構(gòu)體,從而釋放一個資源。這樣,我們就可以通過調(diào)整 maxConcurrency 的值來控制并發(fā)數(shù)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Channel 是什么? channel,通道,本質(zhì)上是一個通信對象,goroutine 之間可以使用它來通信。從...
    癩痢頭閱讀 1,119評論 0 0
  • Golang:通道,同步等待組 并發(fā)爬蟲 在Go的并發(fā)編程中有一句很經(jīng)典的話:不要以共享內(nèi)存的方式去通信,而要以通...
    鬼子口音閱讀 686評論 0 0
  • Go語言中的并發(fā)編程 并發(fā)是編程里面一個非常重要的概念,Go語言在語言層面天生支持并發(fā),這也是Go語言流行的一個很...
    吳佳浩閱讀 405評論 0 1
  • 并發(fā)是編程里面一個非常重要的概念,Go語言在語言層面天生支持并發(fā),這也是Go語言流行的一個很重要的原因。 Go語言...
    雪上霜閱讀 286評論 0 0
  • 導(dǎo)讀 Channel是Golang實現(xiàn)并發(fā)編程非常重要的組成部分,Channel是一種內(nèi)建的核心數(shù)據(jù)類型,需要使用...
    MR_Zzzzzz_閱讀 856評論 0 1

友情鏈接更多精彩內(nèi)容