Запустить горутины можно одновременно, но строгий порядок с паузой требует последовательно разрешать выполнение showNumber. Для этого подойдёт цепочка каналов-сигналов.
Конкурентный упорядоченный вывод чисел с синхронизацией
Запустить горутины можно одновременно, но строгий порядок с паузой требует последовательно разрешать выполнение showNumber. Для этого подойдёт цепочка каналов-сигналов.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо изменить представленный код так, чтобы:
- числа от 1 до 10 выводились параллельно с использованием горутин;
- при этом сохранялась строгая последовательность вывода (1, 2, 3, ..., 10);
- между выводами каждого числа делалась пауза в одну секунду (реализовано функцией showNumber).
import (
"fmt"
"time"
)
func main () {
for cur := 1; cur < 11; cur++ {
// TODO: запустить горутину, вызывающую showNumber(cur)
}
}
func showNumber(val int) {
time.Sleep(time.Second)
fmt.Println(val)
}
Ответ
Запустить горутины можно одновременно, но строгий порядок с паузой требует последовательно разрешать выполнение showNumber. Для этого подойдёт цепочка каналов-сигналов.
Оставьте showNumber без изменений и замените main:
func main() {
gates := make([]chan struct{}, 11)
for i := range gates { gates[i] = make(chan struct{}) }
for n := 1; n <= 10; n++ {
go func(n int) {
<-gates[n-1]
showNumber(n)
close(gates[n])
}(n)
}
close(gates[0])
<-gates[10]
}
Все работники созданы, но печать сериализована: следующий начинает секундную паузу после предыдущего. Ускорить десять обязательных последовательных пауз параллелизмом нельзя.