golang中的生产者消费者

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



MM们
浏览 145回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go