Назад к вопросам
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()
}
}