При каких условиях одна горутина уступает место другой

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

Ответ

Горутина уступает место другой в следующих случаях:

  1. При вызове runtime.Gosched() - явное указание планировщику переключиться
go func() {
    runtime.Gosched() // уступаем место
}()
  1. При блокирующих операциях:

    • Каналы (отправка/получение)
    • Системные вызовы (файловый ввод-вывод, сетевые операции)
    • Вызовы time.Sleep()
    • Работа с sync.Mutex и другими примитивами синхронизации
  2. При достижении кванта времени (обычно ~10мс) - автоматическое переключение планировщиком

  3. При вызове функций из runtime - например, сборка мусора может привести к переключению

Горутины кооперативны - они не вытесняются произвольно, а только в указанных точках. Это отличается от потоков ОС, которые могут быть вытеснены в любой момент.