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