Как можно параллельно выполнять команды на одном ядре

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

Ответ

В Go можно эффективно выполнять задачи на одном ядре, используя горутины и планировщик Go. Хотя физически параллелизма нет, горутины создают иллюзию параллельного выполнения за счёт кооперативной многозадачности.

func worker(id int) {
    for i := 0; i < 3; i++ {
        fmt.Printf("Worker %d: %dn", id, i)
        runtime.Gosched() // Явно уступаем выполнение
    }
}

func main() {
    for i := 1; i <= 2; i++ {
        go worker(i)
    }
    time.Sleep(time.Second)
}

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

  1. Горутины легковесны (2KB стек)
  2. Планировщик переключает горутины при блокирующих операциях или явном вызове runtime.Gosched()
  3. Можно использовать GOMAXPROCS=1 для принудительного выполнения на одном ядре

Такой подход полезен для IO-bound задач или когда нужно избежать накладных расходов на переключение потоков.