go - 使用 golang channel 。获取 "all goroutines are asleep - deadlock!"

标签 go goroutine

我目前正在研究 go routines、channels 和 sync.WaitGroup。我知道 waitgroup 用于根据天气等待所有 go 例程完成 wg.Done() 已被调用足够多次以减少 wg.Add() 中设置的值。 我写了一小段代码来尝试在 golang Playground 上测试这个。显示如下

var channel chan int
var wg sync.WaitGroup


func main() {

  channel := make(chan int)
  mynums := []int{1,2,3,4,5,6,7,8,9} 
  wg.Add(1)

  go addStuff(mynums)
  wg.Wait()
  close(channel)
  recieveStuff(channel)
 }

 func addStuff(mynums []int) {

   for _, val := range mynums {
       channel <- val
   }
   wg.Done()
 }

 func recieveStuff(channel chan int) {
    for val := range channel{
    fmt.Println(val)
 }
} 

我遇到了死锁错误。我正在尝试等待路由返回 wg.Wait()?然后,关闭 channel 。之后,将 channel 发送到recievestuff方法输出 slice 中的值?但它不起作用。我尝试在循环之后将 close() 方法移动到 go 例程中,因为我认为我可能一直在尝试关闭 main() 中的错误例程。到目前为止,我发现这些东西相对困惑,来自 java 和 c#。任何帮助表示赞赏。

最佳答案

调用wg.Wait()直到 wg.Done() 才会回来已调用一次。

addStuff() ,当没有其他 goroutine 耗尽这些值时,您正在将值写入 channel 。由于 channel 是无缓冲的,第一次调用 channel <- val会永远阻塞,导致死锁。

此外,addStuff() 中的 channel 保持为零,因为您正在 main 中创建一个新的变量绑定(bind),而不是分配给包级变量。写入 nil channel 永远阻塞:

channel := make(chan int) //doesn't affect the package-level variable

这是一个修改后的示例,它通过消耗 channel 中的所有值来运行完成:

https://play.golang.org/p/6gcyDWxov7

关于go - 使用 golang channel 。获取 "all goroutines are asleep - deadlock!",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39576130/

相关文章:

go - Golang反射片显示为结构

http - Gin 将 []byte 作为文件

parallel-processing - golang中的并行处理

go - 如何在 3 秒内打印此 Go 代码?

concurrency - 即使独立,第二个 channel 也会导致死锁

mysql - 如何使用 Go 创建到 Cloud SQL 数据库的 TLS 连接?

政府 panic : Empty package path

go - 尝试 Recv 返回 channel 关闭,尽管它是打开的

asynchronous - 当我在 goroutine 中运行 wg.Wait() 时,为什么我的代码可以正常工作?

go - 如何优雅地关闭 golang 服务器?