Конкурентный упорядоченный вывод чисел с синхронизацией

Запустить горутины можно одновременно, но строгий порядок с паузой требует последовательно разрешать выполнение 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]
}

Все работники созданы, но печать сериализована: следующий начинает секундную паузу после предыдущего. Ускорить десять обязательных последовательных пауз параллелизмом нельзя.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее