【问题标题】:fatal error: all goroutines are asleep - deadlock! goroutine 1 [semacquire]: [duplicate]致命错误:所有 goroutine 都处于休眠状态 - 死锁! goroutine 1 [semacquire]:[重复]
【发布时间】:2020-09-07 22:25:18
【问题描述】:

我正在运行 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)
    }

}

【问题讨论】:

  • 不一样的问题....
  • @dılosürücü,它是:一些发送到通道的 goroutine,调用 goroutine 在遍历通道之前调用 WaitGroup.Wait。其他一切都是不会改变问题(或其解决方案)的细节。

标签: go


【解决方案1】:

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

当你在一个 goroutine 中调用 c &lt;- 45 的那一刻,那个 goroutine 会一直等到有人从频道接收。但是直到 range canal 声明被困在 wg.Wait() 之前,消费者才存在。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-02
    • 2013-11-22
    • 2015-01-11
    • 2012-09-06
    • 1970-01-01
    • 2021-04-05
    • 2022-01-21
    • 1970-01-01
    相关资源
    最近更新 更多