Может ли случиться так, что горутина не захочет вытесняться планировщиком

«Может ли случиться так, что горутина не захочет вытесняться планировщиком» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, в Go горутина может временно не вытесняться, если выполняет долгую операцию без точек вытеснения. Планировщик Go кооперативный и вытесняет горутины только в определенных точках (например, при вызове функций, канальных операциях, системных вызовах).

Пример:

func main() {
    runtime.GOMAXPROCS(1)
    go func() {
        for {} // бесконечный цикл без точек вытеснения
    }()
    time.Sleep(time.Millisecond)
    println("Эта строка может никогда не выполниться")
}

В этом случае горутина с бесконечным циклом заблокирует планировщик, так как нет точек вытеснения. На практике такое встречается редко, но важно избегать долгих вычислений без точек вытеснения. Можно добавить runtime.Gosched() в цикл для явного уступания CPU.