Параллельными должны быть подготовка пяти результатов, а печать — последовательной. Неизменённая displayNumber не гарантирует порядок при конкурентных вызовах.
Пакетный конкурентный вывод чисел
Параллельными должны быть подготовка пяти результатов, а печать — последовательной. Неизменённая displayNumber не гарантирует порядок при конкурентных вызовах.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо реализовать конкурентный вывод чисел от 1 до 10, по пять штук одновременно, при этом сохранять порядок их печати. Следующая партия из пяти чисел должна запускаться только после полного завершения предыдущей.
package main
import (
"fmt"
"time"
)
func main() {
// реализуйте логику запуска печати чисел пакетами
}
func displayNumber(value int) {
time.Sleep(time.Second)
fmt.Println(value)
}
Ответ
Параллельными должны быть подготовка пяти результатов, а печать — последовательной. Неизменённая displayNumber не гарантирует порядок при конкурентных вызовах.
Разделим ожидание и вывод: каждая партия запускает пять независимых подготовок, main получает результаты по индексам, а следующая партия начинается после завершения текущей.
package main
import (
"fmt"
"time"
)
func main() {
for start := 1; start <= 10; start += 5 {
ready := make([]chan int, 5)
for i := 0; i < 5; i++ {
ready[i] = make(chan int, 1)
go func(value int, out chan<- int) {
time.Sleep(time.Second)
out <- value
}(start+i, ready[i])
}
for _, out := range ready {
fmt.Println(<-out)
}
}
}
Вывод строго 1–10, подготовка занимает примерно две секундные волны без гарантии точного времени. Если запрещено менять displayNumber, для порядка придётся сериализовать её вызовы, и ожидания внутри уже не выполнятся параллельно.