尝试运行以下代码(生产者和消费者)以了解 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
提交
取消