Назад к вопросам
Middle+
5
```go import ( "fmt" "runtime" "time" ) func main() { runtime.GOMAXPROCS(2) var c chan int for i := 0; i < 5; i++ { go sleeping(i, c) } for i := 0; i < 5; i++ { gopherID := <-c fmt.Println("routine ", gopherID, " has finished sleeping") } } func sleeping(id int, c chan int) { time.Sleep(3 * time.Second) fmt.Println("... ", id, " time to stop ...") c <- id } ```
Компании, где спрашивали
МВидео/эльдорадо
Ответ от нейросети
sobes.tech AI
В этом примере создаётся 5 горутин, каждая из которых спит 3 секунды, затем отправляет свой идентификатор в канал c.
Однако канал c объявлен, но не инициализирован, что приведёт к панике при попытке записи в него. Чтобы исправить, нужно инициализировать канал, например:
c := make(chan int)
Также runtime.GOMAXPROCS(2) ограничивает количество используемых ОС потоков до 2, что влияет на параллелизм.
После запуска горутин в основном потоке происходит чтение из канала 5 раз, что гарантирует ожидание завершения всех горутин.
Исправленный фрагмент:
func main() {
runtime.GOMAXPROCS(2)
c := make(chan int)
for i := 0; i < 5; i++ {
go sleeping(i, c)
}
for i := 0; i < 5; i++ {
gopherID := <-c
fmt.Println("routine", gopherID, "has finished sleeping")
}
}