登录
首页 >  Golang >  Go问答

致命错误:所有 goroutine 都在睡觉 - 死锁!协程 1 :

来源:stackoverflow

时间:2024-04-21 21:18:39 229浏览 收藏

golang学习网今天将给大家带来《致命错误:所有 goroutine 都在睡觉 - 死锁!协程 1 :》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到等等知识点,如果你是正在学习Golang或者已经是大佬级别了,都非常欢迎也希望大家都能给我建议评论哈~希望能帮助到大家!

问题内容

我正在运行 goroutine 及其通道,但仍然出现错误

package main

import (
    "fmt"
    "sync"
    "time"
)

func foo(c chan int, wg *sync.WaitGroup) {
    c <- 45
    time.Sleep(time.Second * 4)
    c <- 122
    wg.Done()

}

func main() {
    canal := make(chan int)
    var wg sync.WaitGroup

    wg.Add(2)
    go foo(canal,&wg)
    go foo(canal,&wg)
    wg.Wait()

    for a := range canal {
        fmt.Println(a)
    }

}

解决方案


make(chan int) 创建一个 unbuffered channel。这意味着所有发送和接收操作员都会等待,直到另一方准备好。

当你在 Goroutine 中调用 c <- 45 时,该 Goroutine 将等待,直到有人从通道接收数据。但是,直到 range canal 语句卡在 wg.Wait() 后面之前,不存在任何消费者。

因此,您的两个 goroutine 被困在发送到通道的过程中,而 main 正在等待 goroutine 完成,然后再从通道消费。

您可以在单独的 goroutine 中使用通道中的元素(在 wg.Wait() 之前),或者创建一个缓冲通道(例如:make(chan int, 10)

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>