Сигнал конца работы в Go
Для сообщения «работа закончена» часто заводят канал пустой структуры: в нем нет байтов данных, важен сам факт события. Получатель ждет одно сигнальное значение или конец канала после завершения отправителем.
Воркер печатает строку, затем шлет
пустую структуру; main ждет этот
знак перед финальной печатью:
package main
import "fmt"
func worker(done chan struct{}) {
fmt.Println("work")
done <- struct{}{}
}
func main() {
done := make(chan struct{})
go worker(done)
<-done
fmt.Println("all finished")
}
Сначала "work", затем "all finished".
Прием из done блокировал main,
пока воркер не отправил сигнал.
Тот же смысл через завершение канала без отдельной отправки: отправитель один раз закрывает связь, получатель читает и выходит:
package main
import "fmt"
func worker(done chan struct{}) {
fmt.Println("step")
close(done)
}
func main() {
done := make(chan struct{})
go worker(done)
<-done
fmt.Println("exit")
}
Дан следующий код:
done := make(chan struct{})
go func() {
fmt.Println("run")
}()
Допишите в ветке отправку пустой
структуры в done и в main
дождитесь сигнала перед печатью
"stop".
Скажите, зачем для сигнала берут тип пустой структуры, а не, например, булево значение в канале.
Скажите, чем отличается ожидание одного
приема из done от ожидания
счетчика группы для одной ветки.