попытался запустить следующий код (производитель & потребителя), чтобы понять goroutines и канал в golang (удалить пакет и импорт из кода ниже):производителя потребитель golang
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 и каналом: Когда мы вызываем функцию produ() и потребляем() из main() с использованием ключевого слова go, переходим к runtime kicks из 2 goroutines (вроде потоков в java-мире, но не в реальных потоках ОС), а главный() goroutine приходит и останавливается на " < -done ". Теперь внутри production() - цикл идет от 0 до 9, а внутри цикла канал msgs получает int (от 0 до 9) 1 за время, которое потребляется параллельно потреблением(); однако продукция не имеет понятия об этом, и она просто держит зацикливание от 0 до 9.
Вопрос: Предполагая, что мое понимание правильное. Однажды цикл for сделан, почему следующая printLine внутри продукта() не печатается, а также почему канал msgs не закрывается? Почему goroutine останавливается внутри продукта(), пока потребитель не потребляет все msgs?
Операторы печати в производителе получить печатный и канал msgs закрывается сразу после выхода цикла for. Я не понимаю, о чем вы спрашиваете. – JimB
Тогда почему на выходе выводятся инструкции печати - «Перед закрытием канала» и «Перед передачей правдоподобного результата» после «Потребитель: 8», т. Е. После того, как все msgs будут использованы? – srock
Отправка и получение по небуферизованному каналу синхронно. Документы, вероятно, помогут: http://golang.org/doc/effective_go.html#channels – JimB