Что такое горутины и как они отличаются от потоков?

К вопросам
Легкий
Concurrency

Вопрос

Объясните концепцию горутин в Go. В чем их основные отличия от обычных потоков операционной системы? Как Go runtime управляет горутинами? Приведите пример использования.

Ответ

Горутины - это легковесные потоки, управляемые Go runtime. Основные отличия: - Горутины намного легче OS-потоков (стартуют с ~2KB стека vs ~2MB) - Go runtime мультиплексирует горутины на небольшое количество OS-потоков - Переключение контекста горутин намного быстрее - Go использует кооперативную многозадачность - Планировщик горутин встроен в runtime

package main

import (
    "fmt"
    "time"
)

func sayHello(name string) {
    for i := 0; i < 3; i++ {
        fmt.Printf("Hello, %s! %d
", name, i)
        time.Sleep(100 * time.Millisecond)
    }
}

func main() {
    // Запуск горутины
    go sayHello("World")
    go sayHello("Go")
    
    // Ждем завершения
    time.Sleep(time.Second)
}
package main

import (
    "fmt"
    "time"
)

func sayHello(name string) {
    for i := 0; i < 3; i++ {
        fmt.Printf("Hello, %s! %d
", name, i)
        time.Sleep(100 * time.Millisecond)
    }
}

func main() {
    // Запуск горутины
    go sayHello("World")
    go sayHello("Go")
    
    // Ждем завершения
    time.Sleep(time.Second)
}

Дополнительные вопросы

Как работает планировщик горутин (GMP model)? Что такое work stealing?