日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

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

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

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

type WaitGroup struct {
    noCopy noCopy

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

登錄后復(fù)制

WaitGroup通常在主goroutine中創(chuàng)建,然后主goroutine中的每個(gè)子goroutine調(diào)用Add方法增加計(jì)數(shù)器,執(zhí)行完畢后通過Done方法減少計(jì)數(shù)器。主goroutine可以通過Wait方法來等待計(jì)數(shù)器歸零。具體示例代碼如下:

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")
}

登錄后復(fù)制

在上述示例中,我們創(chuàng)建了一個(gè)WaitGroup對(duì)象,然后通過調(diào)用Add方法來增加計(jì)數(shù)器。接著,我們創(chuàng)建了三個(gè)子goroutine,每個(gè)goroutine執(zhí)行完成后通過Done方法減少計(jì)數(shù)器。最后,主goroutine通過調(diào)用Wait方法來等待計(jì)數(shù)器歸零。當(dāng)所有任務(wù)執(zhí)行完畢后,程序?qū)⑤敵?#8221;All tasks completed”。

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

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)
    }
}

登錄后復(fù)制

在上述示例中,我們定義了worker函數(shù),該函數(shù)從jobs channel中讀取待處理的任務(wù),然后執(zhí)行任務(wù)并將結(jié)果發(fā)送到results channel中。我們創(chuàng)建了一個(gè)jobs channel和一個(gè)results channel,通過分發(fā)任務(wù)和獲取結(jié)果來實(shí)現(xiàn)協(xié)程池的功能。

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

三、WaitGroup和協(xié)程池的高效結(jié)合案例
接下來,我們將結(jié)合上述兩個(gè)概念,介紹如何高效地使用WaitGroup和協(xié)程池來實(shí)現(xiàn)并發(fā)編程。具體示例代碼如下:

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)
    }
}

登錄后復(fù)制

在上述示例中,我們創(chuàng)建了一個(gè)WaitGroup對(duì)象,并通過調(diào)用Add方法增加計(jì)數(shù)器。然后,我們創(chuàng)建了一個(gè)jobs channel和一個(gè)results channel,用于分發(fā)任務(wù)和獲取結(jié)果。我們創(chuàng)建了一組固定數(shù)量的工人(goroutine),并使用Wait方法來等待它們完成任務(wù)。

在主函數(shù)中,我們向jobs channel發(fā)送待執(zhí)行的任務(wù),并在執(zhí)行完畢后關(guān)閉該channel。然后,我們啟動(dòng)一個(gè)協(xié)程來等待所有工人完成任務(wù),并在完成后關(guān)閉results channel。最后,我們通過從results channel中獲取計(jì)算結(jié)果來輸出。

結(jié)論:
通過結(jié)合使用WaitGroup和協(xié)程池的方式,我們可以高效地實(shí)現(xiàn)并發(fā)編程。通過使用WaitGroup來等待一組協(xié)程的執(zhí)行完成,可以保證主goroutine在所有任務(wù)完成后繼續(xù)執(zhí)行。而通過使用協(xié)程池,我們可以避免頻繁地創(chuàng)建和銷毀goroutine的開銷,提高程序的執(zhí)行效率和資源利用率。

代碼示例中的斐波那契數(shù)列計(jì)算只是一個(gè)演示示例,實(shí)際應(yīng)用中可以根據(jù)具體需求替換為其他任務(wù)。使用WaitGroup和協(xié)程池,我們可以更好地控制并發(fā)執(zhí)行的任務(wù)數(shù)量,有效地利用計(jì)算資源。

盡管Go語言提供了豐富的并發(fā)編程工具和特性,但在使用時(shí)仍需謹(jǐn)慎。合理地使用WaitGroup和協(xié)程池,可以幫助我們更好地管理和調(diào)度goroutine,并實(shí)現(xiàn)高效的并發(fā)編程。

以上就是Golang WaitGroup和協(xié)程池的高效結(jié)合的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注www.xfxf.net其它相關(guān)文章!

分享到:
標(biāo)簽:Golang WaitGroup 協(xié)程池
用戶無頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績?cè)u(píng)定