gpt4 book ai didi

golang goroutines, chanel 和 sync.WaitGroup

转载 作者:行者123 更新时间:2023-12-01 20:22:23 24 4
gpt4 key购买 nike

我使用简单的代码,但我总是陷入僵局。
请向初学者解释我做错了什么。

package main

import (
"fmt"
"sync"
)

func main() {
var wg sync.WaitGroup

ok := make(chan int, 3)
for i := 0; i < 2; i++ {
wg.Add(1)

go func(i int, wg *sync.WaitGroup) {
for x := range ok {
fmt.Println(i, x)
if x >= 5 {
ok <- x - 1
}
}
wg.Done()
}(i, &wg)
}

ok <- 1
ok <- 3
ok <- 2
ok <- 5
ok <- 3
ok <- 9

wg.Wait()
}

fatal error :所有 goroutine 都处于休眠状态 - 死锁!

最佳答案

  • 问题的背景是范围运算符从 channel 中读取,直到 channel 关闭。因此,for-range 循环一直在等待来自 channel ok 的更多输入。即使在某个时候没有更多的输入。同时wg.Wait()正在等待 goroutine 完成。因此陷入僵局!
  • 要么你必须关闭 ok channel 在某个点,其中
    没有更多的输入值到 channel ok .

  • 或者您可以像使用工作池一样,
    package main

    import (
    "fmt"
    "strconv"
    "sync"
    )

    func worker(wg *sync.WaitGroup, ch chan string, i int) {
    defer wg.Done()
    ch <- "worker process value " + strconv.Itoa(i)
    }

    func workerMonitor(wg *sync.WaitGroup, ch chan string) {
    wg.Wait()
    close(ch)
    }

    func doWork(ch <-chan string, done chan<- bool) {
    for i := range ch {
    fmt.Println(i)
    }
    done <- true
    }

    func main() {
    var wg sync.WaitGroup
    ch := make(chan string)
    var arr = [6]int{1, 3, 2, 5, 3, 9}
    for i := 0; i < len(arr); i++ {
    wg.Add(1)
    if arr[i] >= 5 {
    for j := arr[i]; j >= 5; j-- {
    wg.Add(1)
    go worker(&wg, ch, j-1)
    }
    }
    go worker(&wg, ch, arr[i])
    }

    go workerMonitor(&wg, ch)

    done := make(chan bool, 1)
    go doWork(ch, done)
    <-done
    }

    Play ground url

    关于golang goroutines, chanel 和 sync.WaitGroup,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61398635/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com