main не ждёт горутины, поэтому программа обычно завершается почти сразу и ничего не печатает. Десять секунд из десяти Sleep здесь не складываются.
Оценка времени работы программы с 10 горутинами
main не ждёт горутины, поэтому программа обычно завершается почти сразу и ничего не печатает. Десять секунд из десяти Sleep здесь не складываются.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Нужно определить, за какое время завершится программа, если запустить 10 горутин, каждая из которых вызывает функцию printNumber, внутри которой происходит пауза в одну секунду перед выводом числа.
package main
import (
"fmt"
"time"
)
func main() {
for idx := 0; idx < 10; idx++ {
go func() {
printNumber(idx)
}()
}
}
func printNumber(val int) {
time.Sleep(time.Second)
fmt.Println(val)
}
Ответ
main не ждёт горутины, поэтому программа обычно завершается почти сразу и ничего не печатает. Десять секунд из десяти Sleep здесь не складываются.
Создание goroutine лишь планирует работу. Возврат main завершает процесс, даже если другие горутины спят. Точное время исходной программы не является обещанием задержки в секунду или десять секунд.
Если добавить WaitGroup, десять независимых секундных ожиданий будут выполняться конкурентно и общее время окажется примерно секундой плюс накладные расходы. Чтобы значения не зависели от старой семантики захвата, передавайте idx аргументом функции. Строго последовательные вызовы без go дали бы около десяти секунд.