Вопрос проверяет понимание проблем синхронизации горутин в Go и почему использование time.Sleep является ненадёжным подходом.
В Go горутины выполняются конкурентно, и их порядок выполнения не детерминирован. Использование time.Sleep для ожидания завершения другой горутины — это хрупкий подход, который может работать в тестовой среде, но ломается в реальных условиях. Планировщик Go может приостановить горутину на неопределённое время, и фиксированная задержка не гарантирует, что нужная работа уже выполнена.
Вместо time.Sleep используйте механизмы синхронизации из пакета sync или каналы:
package main
import (
"fmt"
"sync"
)
func worker(wg *sync.WaitGroup) {
defer wg.Done()
fmt.Println("Работа выполняется")
}
func main() {
var wg sync.WaitGroup
wg.Add(1)
go worker(&wg)
wg.Wait() // Правильная синхронизация
fmt.Println("Горутина завершена")
}Каналы также позволяют синхронизировать горутины, передавая сигналы о завершении:
package main
import "fmt"
func worker(done chan bool) {
fmt.Println("Работа выполняется")
done <- true
}
func main() {
done := make(chan bool)
go worker(done)
<-done // Ожидание сигнала
fmt.Println("Горутина завершена")
}Использование time.Sleep для синхронизации горутин — это антипаттерн, который приводит к ненадёжному и трудноотлаживаемому коду. Всегда применяйте каналы, sync.WaitGroup или мьютексы для гарантированной и предсказуемой синхронизации в Go.