亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.430618.com 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

Golang WaitGroup和協程池的高效結合,需要具體代碼示例

引言:
Go語言是一門強調并發編程的語言,通過協程(goroutine)的方式實現高效并發執行。在一些需要同時執行多個任務的場景中,使用WaitGroup和協程池的組合可以有效地提高程序的執行效率和資源利用率。本文將介紹如何使用Golang中的WaitGroup和協程池來實現高效的并發編程,并提供具體的代碼示例。

一、WaitGroup簡介
WaitGroup是Go語言中用于等待一組協程執行完成的工具。其源碼定義如下:

type WaitGroup struct {
    noCopy noCopy

    // 64位的值:高32位存儲計數器,低32位存儲等待計數器
    // 這個變量可以被原子操作加載和存儲。
    // 在64位同步原語中,它必須在64位邊界對齊。
    // 是一個強制的要求。
    state1 [3]uint32
}

登錄后復制

WaitGroup通常在主goroutine中創建,然后主goroutine中的每個子goroutine調用Add方法增加計數器,執行完畢后通過Done方法減少計數器。主goroutine可以通過Wait方法來等待計數器歸零。具體示例代碼如下:

package main

import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup
    wg.Add(3)

    go func() {
        defer wg.Done()
        fmt.Println("Task 1 executing")
    }()

    go func() {
        defer wg.Done()
        fmt.Println("Task 2 executing")
    }()

    go func() {
        defer wg.Done()
        fmt.Println("Task 3 executing")
    }()

    wg.Wait()
    fmt.Println("All tasks completed")
}

登錄后復制

在上述示例中,我們創建了一個WaitGroup對象,然后通過調用Add方法來增加計數器。接著,我們創建了三個子goroutine,每個goroutine執行完成后通過Done方法減少計數器。最后,主goroutine通過調用Wait方法來等待計數器歸零。當所有任務執行完畢后,程序將輸出”All tasks completed”。

二、協程池簡介
在并發編程中,協程池(goroutine pool)是一種常用的模式。通過創建一組固定數量的goroutine,并將任務均勻分發給它們,可以避免不斷創建和銷毀goroutine的開銷。在Go語言中,可以使用channel來實現協程池。具體示例代碼如下:

package main

import (
    "fmt"
    "sync"
)

func worker(id int, jobs <-chan int, results chan<- int) {
    for j := range jobs {
        fmt.Println("Worker", id, "started job", j)
        fib := fibonacci(j)
        fmt.Println("Worker", id, "finished job", j)
        results <- fib
    }
}

func fibonacci(n int) int {
    if n <= 1 {
        return n
    }

    return fibonacci(n-1) + fibonacci(n-2)
}

const numJobs = 5
const numWorkers = 3

func main() {
    jobs := make(chan int, numJobs)
    results := make(chan int, numJobs)

    var wg sync.WaitGroup
    wg.Add(numWorkers)

    for w := 1; w <= numWorkers; w++ {
        go func(id int) {
            defer wg.Done()
            worker(id, jobs, results)
        }(w)
    }

    for j := 1; j <= numJobs; j++ {
        jobs <- j
    }
    close(jobs)

    wg.Wait()

    for r := 1; r <= numJobs; r++ {
        fmt.Println(<-results)
    }
}

登錄后復制

在上述示例中,我們定義了worker函數,該函數從jobs channel中讀取待處理的任務,然后執行任務并將結果發送到results channel中。我們創建了一個jobs channel和一個results channel,通過分發任務和獲取結果來實現協程池的功能。

在主函數中,我們使用WaitGroup來等待所有工人(goroutine)完成任務執行。然后,我們向jobs channel發送待執行的任務,并在執行完畢后關閉該channel。最后,我們從results channel中獲取計算結果并輸出。

三、WaitGroup和協程池的高效結合案例
接下來,我們將結合上述兩個概念,介紹如何高效地使用WaitGroup和協程池來實現并發編程。具體示例代碼如下:

package main

import (
    "fmt"
    "sync"
)

func worker(id int, jobs <-chan int, results chan<- int) {
    for j := range jobs {
        fmt.Println("Worker", id, "started job", j)
        fib := fibonacci(j)
        fmt.Println("Worker", id, "finished job", j)
        results <- fib
    }
}

func fibonacci(n int) int {
    if n <= 1 {
        return n
    }

    return fibonacci(n-1) + fibonacci(n-2)
}

const numJobs = 5
const numWorkers = 3

func main() {
    var wg sync.WaitGroup
    wg.Add(numWorkers)

    jobs := make(chan int, numJobs)
    results := make(chan int, numJobs)

    for w := 1; w <= numWorkers; w++ {
        go func(id int) {
            defer wg.Done()
            worker(id, jobs, results)
        }(w)
    }

    for j := 1; j <= numJobs; j++ {
        jobs <- j
    }
    close(jobs)

    go func() {
        wg.Wait()
        close(results)
    }()

    for r := range results {
        fmt.Println(r)
    }
}

登錄后復制

在上述示例中,我們創建了一個WaitGroup對象,并通過調用Add方法增加計數器。然后,我們創建了一個jobs channel和一個results channel,用于分發任務和獲取結果。我們創建了一組固定數量的工人(goroutine),并使用Wait方法來等待它們完成任務。

在主函數中,我們向jobs channel發送待執行的任務,并在執行完畢后關閉該channel。然后,我們啟動一個協程來等待所有工人完成任務,并在完成后關閉results channel。最后,我們通過從results channel中獲取計算結果來輸出。

結論:
通過結合使用WaitGroup和協程池的方式,我們可以高效地實現并發編程。通過使用WaitGroup來等待一組協程的執行完成,可以保證主goroutine在所有任務完成后繼續執行。而通過使用協程池,我們可以避免頻繁地創建和銷毀goroutine的開銷,提高程序的執行效率和資源利用率。

代碼示例中的斐波那契數列計算只是一個演示示例,實際應用中可以根據具體需求替換為其他任務。使用WaitGroup和協程池,我們可以更好地控制并發執行的任務數量,有效地利用計算資源。

盡管Go語言提供了豐富的并發編程工具和特性,但在使用時仍需謹慎。合理地使用WaitGroup和協程池,可以幫助我們更好地管理和調度goroutine,并實現高效的并發編程。

以上就是Golang WaitGroup和協程池的高效結合的詳細內容,更多請關注www.xfxf.net其它相關文章!

分享到:
標簽:Golang WaitGroup 協程池
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定