【问题标题】:I want to communicate between goroutines and block main thread indefinitely我想在 goroutines 之间进行通信并无限期地阻塞主线程
【发布时间】:2018-07-17 23:19:15
【问题描述】:

我如何阻止 main func 并允许 goroutines 通过通道进行通信以下代码示例会引发错误

0 致命错误:所有 goroutine 都处于休眠状态 - 死锁!

package main

import (
  "fmt"
  "time"
)

func main() {
   ch := make(chan int)

   go func() {
       value := <-ch
       fmt.Print(value) // This never prints!
   }()

   go func() {
       for i := 0; i < 100; i++ {
           time.Sleep(100 * time.Millisecond)
           ch <- i
       }
   }()

   c := make(chan int)
   <-c
}

【问题讨论】:

  • 你在哪里运行这个?如果GOMAXPROCS大于1,则打印0,然后死锁。
  • 在我的情况下它什么也不打印,只是抛出那个错误
  • 当然可以打印。您自己显示输出:0fatal error ...。行首的0来自打印语句。
  • 哇 .. 实际上,您对此的反应非常重要。我的代码确实有效。问题是我的结局并不好,所以当所有 goroutines 都睡觉时......它会死锁。
  • 如果由于 main 没有做任何事情而死锁,则将 goroutine 移至 main 中的 for 循环,这意味着您应该在 main 函数中执行您的例程之一,

标签: go goroutine channels


【解决方案1】:

我认为您想打印所有值 [0:99]。然后你需要在第一个 go routine 循环。

另外,你需要传递信号来中断循环

func main() {
    ch := make(chan int)
    stopProgram := make(chan bool)

    go func() {
        for i := 0; i < 100; i++ {
            value := <-ch
            fmt.Println(value)
        }
        // Send signal through stopProgram to stop loop
        stopProgram <- true
    }()

    go func() {
        for i := 0; i < 100; i++ {
            time.Sleep(100 * time.Millisecond)
            ch <- i
        }
    }()

    // your problem will wait here until it get stop signal through channel
    <-stopProgram
}

【讨论】:

  • 也谢谢! .. for 第一个 go 例程中的循环。我现在对它有了更好的理解。
猜你喜欢
  • 1970-01-01
  • 2012-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-16
相关资源
最近更新 更多