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

GOLANG:学习goroutine让我陷入了僵局

GOLANG:学习goroutine让我陷入了僵局

Go
九州编程 2021-09-27 17:29:37
我是 GO 新手,我正试图弄清楚 goroutines 是如何工作的以及如何同步它们。这是我写的一个简单的程序来了解它们:package mainimport (        "fmt"        "sync"        "time")func printAfterDelay(delay time.Duration, message string, wg *sync.WaitGroup) {        time.Sleep(delay)        fmt.Println(message)        wg.Done()}func add(a int, b int, chan1 chan int, wg *sync.WaitGroup) {        c := a + b        chan1 <- c        //close(chan1)        wg.Done()}func printer(chan1 chan int, wg *sync.WaitGroup) {        for result := range chan1 {                //result := <-chan1                //time.Sleep(2000 * time.Millisecond)                fmt.Println(result)        }        close(chan1)        wg.Done()}func main() {        //var wg sync.WaitGroup        wg := &sync.WaitGroup{}        fmt.Println("Start...")        wg.Add(1)        go printAfterDelay(2000*time.Millisecond, "Try", wg)        chan1 := make(chan int)        wg.Add(1)        go add(5, 4, chan1, wg)        wg.Add(1)        go add(3, 1, chan1, wg)        wg.Add(1)        go printer(chan1, wg)        //time.Sleep(3000 * time.Millisecond)        wg.Wait()        fmt.Println("End")}add 函数接受两个 int,将它们相加并将结果传递给一个 chan。打印机功能从 chan 获取结果并打印它们。这两个函数在 main() 中作为 goroutines 调用,所以我还传递了一个 WaitGroup 作为指针,它在调用 goroutines 之前递增,并在函数结束时递减。
查看完整描述

1 回答

?
长风秋雁

TA贡献1757条经验 获得超7个赞

以下作品。我的意思是它不会死锁。由于您在通道上的范围循环中具有打印机功能,因此它会在通道关闭后自动停止。我在接近尾声时添加了 3 秒延迟,以便让 try 循环有时间打印。不过请阅读文档。它将 100% 解释这些细节。


package main


import (

        "fmt"

        "sync"

        "time"

)


func printAfterDelay(delay time.Duration, message string, wg *sync.WaitGroup) {

        time.Sleep(delay)

        fmt.Println(message)


}


func add(a int, b int, chan1 chan int, wg *sync.WaitGroup) {

        c := a + b

        chan1 <- c

        wg.Done()

}


func printer(chan1 chan int, wg *sync.WaitGroup) {

        for result := range chan1 {

                fmt.Println(result)

        }

}


func main() {

        //var wg sync.WaitGroup

        wg := &sync.WaitGroup{}


        fmt.Println("Start...")


        go printAfterDelay(2000*time.Millisecond, "Try", wg)


        chan1 := make(chan int)

        wg.Add(1)

        go add(5, 4, chan1, wg)


        wg.Add(1)

        go add(3, 1, chan1, wg)


        go printer(chan1, wg)


        time.Sleep(3000 * time.Millisecond)

        wg.Wait()

    close(chan1)


        fmt.Println("End")

}


查看完整回答
反对 回复 2021-09-27
  • 1 回答
  • 0 关注
  • 152 浏览
慕课专栏
更多

添加回答

举报

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