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

golang中的生产者消费者

golang中的生产者消费者

Go
MM们 2021-09-27 21:06:08
尝试运行以下代码(生产者和消费者)以了解 golang 中的 goroutine 和通道(从下面的代码片段中删除了包和导入):var done = make(chan bool)var msgs = make(chan int)func produce() {    for i := 0; i < 10; i++ {            msgs <- i    }    fmt.Println("Before closing channel")    close(msgs)    fmt.Println("Before passing true to done")    done <- true}func consume() {    for {            msg := <-msgs            time.Sleep(100 * time.Millisecond)            fmt.Println("Consumer: ", msg)    }}func main() {    go produce()    go consume()    <-done    fmt.Println("After calling DONE")}源代码来自:http : //www.golangpatterns.info/concurrency/producer-consumer下面是我运行代码时的输出Consumer:  0Consumer:  1Consumer:  2Consumer:  3Consumer:  4Consumer:  5Consumer:  6Consumer:  7Consumer:  8Before closing channelBefore passing true to doneAfter calling DONE根据我对 goroutines 和 channel 的理解:当我们使用 go 关键字从 main() 调用produce() 和consume() 时,go 运行时会触发2 个goroutines(Java 世界中的线程,但不是实际的OS 线程)和main () goroutine 到达并在“<-done”处停止。现在在 generate() 内部 - 循环从 0 到 9,并且在循环内部,msgs 通道接收 int (0 到 9) 1,该时间由消耗 () 并行消耗;然而,produce 对此一无所知,它只是不断循环 0 到 9。问:假设我的上述理解是正确的。有一次,for 循环完成了,为什么没有打印出生产()中的下一个打印行,以及为什么 msgs 通道没有关闭?为什么 goroutine 在produce() 中停止,直到消费者消费完所有的msgs?
查看完整描述

1 回答

  • 1 回答
  • 0 关注
  • 144 浏览
慕课专栏
更多

添加回答

举报

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