Как работает Asynchronous Preemptible

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

Ответ

В Go 1.14+ появилась асинхронная вытесняющая (preemptive) многозадачность. Раньше горутины могли быть вытеснены только при вызове функций или в точках безопасного прерывания. Теперь рантайм может прервать любую горутину асинхронно, посылая сигнал SIGURG (через runtime.preemptM).

Ключевые моменты:

  1. Работает на уровне ОС через сигналы
  2. Позволяет избежать "голодания" из-за долгих вычислений
  3. Не требует явных вызовов функций

Пример:

func main() {
    runtime.GOMAXPROCS(1)
    go func() {
        for {} // Бесконечный цикл
    }()
    time.Sleep(time.Millisecond)
    println("OK") // Выполнится благодаря preemption
}