Что такое горутины и как они отличаются от потоков?
Вопрос
Объясните концепцию горутин в 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?