为了账号安全,请及时绑定邮箱和手机立即绑定

golang chanel 无法与 sync.WaitGroup 一起使用

golang chanel 无法与 sync.WaitGroup 一起使用

Go
肥皂起泡泡 2022-06-27 15:58:46
我的代码package mainimport (   "fmt"   "sync")func other(c chan int, wg *sync.WaitGroup) {   c <- 455   wg.Done()}func addInt(c chan int, d int, wg *sync.WaitGroup) {   c <- d   wg.Done()}func main() {   var wg sync.WaitGroup   myChanel := make(chan int)   wg.Add(2)   go addInt(myChanel, 5, &wg)   go other(myChanel, &wg)   wg.Wait()   c := 0   for v := range myChanel {       if c == 1 {           close(myChanel)       }       fmt.Println(v)       c++   }}我正在学习 golang 看地雷,但我确实遇到了这样的错误。我查看了其他来源。我无法找到健康的解决方案。我再次尝试关闭(香奈儿)。错误输出fatal error: all goroutines are asleep - deadlock!goroutine 1 [semacquire]:sync.runtime_Semacquire(0xc0000140f8)        /usr/lib/go-1.13/src/runtime/sema.go:56 +0x42sync.(*WaitGroup).Wait(0xc0000140f0)        /usr/lib/go-1.13/src/sync/waitgroup.go:130 +0x64main.main()        /home/zeus/go/src/github.com/awesomeProject/pool.go:27 +0xe4goroutine 6 [chan send]:main.addInt(0xc000016120, 0x5, 0xc0000140f0)        /home/zeus/go/src/github.com/awesomeProject/pool.go:14 +0x3fcreated by main.main        /home/zeus/go/src/github.com/awesomeProject/pool.go:24 +0xaagoroutine 7 [chan send]:main.other(0xc000016120, 0xc0000140f0)        /home/zeus/go/src/github.com/awesomeProject/pool.go:9 +0x37created by main.main        /home/zeus/go/src/github.com/awesomeProject/pool.go:25 +0xd6exit status 2
查看完整描述

2 回答

?
慕慕森

TA贡献1856条经验 获得超17个赞

你有一个无缓冲的通道,这意味着你不能在它上面发送,直到有东西等待接收。

所以当你这样做时:

wg.Wait()

在你做之前

for v := range myChanel

您将永远无法到达接收器。

无论如何,在使用无缓冲通道时,我从来不需要使用等待组,根据我的经验,您只需要在没有通道的情况下进行并发处理时才需要它们。你可以这样做:https: //play.golang.org/p/-SUuXGlFd1E


查看完整回答
反对 回复 2022-06-27
?
12345678_0001

TA贡献1802条经验 获得超5个赞

我解决了


运行


package main


import (

    "fmt"

    "sync"

    "time"

)


func other(c chan int, wg *sync.WaitGroup) {

    time.Sleep(time.Second*1)

    c <- 455

    wg.Done()

}


func addInt(c chan int, d int, wg *sync.WaitGroup) {

    c <- d

    wg.Done()

}

func main() {


    var wg sync.WaitGroup

    myChanel := make(chan int)


    wg.Add(2)


    go addInt(myChanel, 5, &wg)

    go other(myChanel, &wg)


    go func() {

        wg.Wait()

        close(myChanel)

    }()


    for v := range myChanel {

        fmt.Println(v)

    }


}


查看完整回答
反对 回复 2022-06-27
  • 2 回答
  • 0 关注
  • 134 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信