Какие знаешь причины, по которым горутина убирается из потока

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

Ответ

Горутина может быть убрана из потока (descheduled) в следующих случаях:

  1. Блокирующие операции - вызовы типа time.Sleep(), канальные операции (<-chan), системные вызовы (I/O, мьютексы)
  2. Вызов runtime.Gosched() - явное освобождение потока для других горутин
  3. Превышение кванта времени - примерно 10мс на горутину (зависит от версии Go)
  4. Работа сборщика мусора - GC может приостанавливать горутины

Пример блокировки по каналу:

ch := make(chan int)
go func() {
    <-ch // горутина заблокируется здесь
    fmt.Println("Received")
}()

Горутины управляются планировщиком Go (не ОС), что делает переключения легковесными.