Создайте цепочку разрешений: каждая горутина ждёт свой сигнал, вызывает printNumber и разрешает следующую. Печать остаётся последовательной, хотя работников несколько.
Одновременный вывод чисел с сохранением порядка
Создайте цепочку разрешений: каждая горутина ждёт свой сигнал, вызывает printNumber и разрешает следующую. Печать остаётся последовательной, хотя работников несколько.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо поправить программу так, чтобы функция printNumber запускалась в нескольких горутинах, но при этом числа от 1 до 10 выводились строго последовательно (1, 2, 3, …, 10) с задержкой в одну секунду перед каждым выводом.
package main
import (
"fmt"
"time"
)
func main() {
for idx := 0; idx < 10; idx++ {
printNumber(idx + 1)
}
}
func printNumber(num int) {
time.Sleep(time.Second)
fmt.Println(num)
}
Ответ
Создайте цепочку разрешений: каждая горутина ждёт свой сигнал, вызывает printNumber и разрешает следующую. Печать остаётся последовательной, хотя работников несколько.
Замените main, оставив printNumber:
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]
printNumber(n)
close(gates[n])
}(n)
}
close(gates[0])
<-gates[10]
}
Последний сигнал одновременно служит ожиданием завершения. Нельзя одновременно выполнять все паузы и обещать секундный промежуток между каждой печатью: эту часть приходится сериализовать.