Планировщик Go может переключить горутину в следующих точках:
// До Go 1.14 этот цикл мог заблокировать поток навсегда:
go func() {
for { // tight loop без вызовов функций
i++ // не уступает управление!
}
}()
// С Go 1.14+ планировщик прервет горутину по сигналу
Asynchronous preemption в Go 1.14 решил проблему "зависших" горутин в tight loops.