Sobes.tech
Назад к вопросам
Senior
5

Когда происходит переключение горутин без вытеснения (кооперативное)?

Компании, где спрашивали
I-teco

Ответ от нейросети

sobes.tech AI

В Go переключение горутин без вытеснения (кооперативное переключение) происходит в следующих случаях:

  • Когда горутина выполняет операции, которые явно вызывают планировщик, например, вызов runtime.Gosched(). Это позволяет текущей горутине уступить управление другим горутинам.
  • При блокирующих операциях, таких как ожидание на канале, ввод-вывод или синхронизация, горутина приостанавливается, и планировщик переключается на другую.

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

Пример:

func main() {
    go func() {
        for i := 0; i < 5; i++ {
            fmt.Println("Goroutine 1", i)
            runtime.Gosched() // уступаем управление
        }
    }()

    for i := 0; i < 5; i++ {
        fmt.Println("Main goroutine", i)
        runtime.Gosched()
    }
}