尝试运行以下代码(生产者和消费者)来理解golang中的goroutines和通道(从下面的代码片段删除包和导入):
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: 0
Consumer: 1
Consumer: 2
Consumer: 3
Consumer: 4
Consumer: 5
Consumer: 6
Consumer: 7
Consumer: 8
Before closing channel
Before passing true to done
After calling DONE根据我对goroutines和通道的理解:当我们使用go关键字调用产()和从main()消费()时,go运行时启动了2个goroutines(在java世界中类似于线程,而不是实际的OS线程),而main() goroutine来了并停止了“<-go”。现在循环从0到9,在循环中msgs通道一次接收int (0到9) 1,这些int(0到9)1由inside ()并行使用;但是produce不知道它,它只是在0到9之间循环。
问题:假设我的上述理解是正确的。一旦完成了for循环,为什么printLine ()中的下一个没有被打印,以及为什么msgs通道没有关闭?为什么在产品()内停下来,直到消费者吃完所有的味精?
发布于 2021-06-29 13:06:19
package main
import (
"fmt"
)
var ch chan int
var ch1 chan struct{}
func main() {
ch = make(chan int)
ch1 = make(chan struct{})
go producer()
go consumer()
<-ch1
close(ch)
close(ch1)
}
func consumer() {
for {
fmt.Println("number", <-ch)
}
}
func producer() {
for i := 0; i < 10; i++ {
ch <- i
}
ch1 <- struct{}{}
}https://stackoverflow.com/questions/29634649
复制相似问题