Sobes.tech
Назад к вопросам
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")
	}
}