Ответ
В Go 1.14+ появилась асинхронная вытесняющая (preemptive) многозадачность. Раньше горутины могли быть вытеснены только при вызове функций или в точках безопасного прерывания. Теперь рантайм может прервать любую горутину асинхронно, посылая сигнал SIGURG (через runtime.preemptM).
Ключевые моменты:
- Работает на уровне ОС через сигналы
- Позволяет избежать "голодания" из-за долгих вычислений
- Не требует явных вызовов функций
Пример:
func main() {
runtime.GOMAXPROCS(1)
go func() {
for {} // Бесконечный цикл
}()
time.Sleep(time.Millisecond)
println("OK") // Выполнится благодаря preemption
}