Как ограничение GOMAXPROCS влияет на вывод программы

В современных Go с включённым асинхронным вытеснением сообщение обычно будет напечатано, несмотря на GOMAXPROCS(1). После этого программа продолжит бесконечный цикл.

Короткий ответ

Что ответить на собеседовании

В современных Go с включённым асинхронным вытеснением сообщение обычно будет напечатано, несмотря на GOMAXPROCS(1). После этого программа продолжит бесконечный цикл.

Подробный разбор

Ответ с пояснениями

Условие

Что будет напечатано при выполнении следующего кода?

func main() {
    runtime.GOMAXPROCS(1)

    go func() {
        fmt.Println("I'm a skilled Go developer")
    }()

    for {
    }
}

Ответ

В современных Go с включённым асинхронным вытеснением сообщение обычно будет напечатано, несмотря на GOMAXPROCS(1). После этого программа продолжит бесконечный цикл.

Начиная с Go 1.14 runtime умеет прерывать многие CPU-циклы без вызовов функций. Один P ограничивает одновременное выполнение Go-кода, а не число горутин. Поведение зависит от платформы и настроек вытеснения; в старом runtime или при его отключении пустой цикл может не дать горутине выполниться. Для корректной программы используйте явное ожидание, а не полагайтесь на планировщик.

Источник: go.dev.

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

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

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

Подробнее