go-подпрограммы
About
Go-рутины — это легковесный управляемый поток. Go-рутины запускаются в одинаковых адресных пространствах, так что доступ к общей памяти должен быть синхронизирован. Пакет sync предоставляет примитивы, однако в Go и есть другие подходы.
Запуск go-подпрограммы
go функция(аргументы)
go func(параметры) {блок}(аргументы)Например:
package main
import "fmt"
func printHello() {
fmt.Println("Hello from printHello")
}
func main() {
// Встроенная Go-рутина
go func() {
fmt.Println("Hello from inline")
}()
// Функция как Go-рутина
go printHello()
// Функция в главном потоке
println("Hello from main")
}
Если вызвать такую программу, выведется в консоль только Hello from main, так как main-функция не дождалась выполнения go-рутины. Тут нам понадобятся каналы:
sync.Mutex
Для блокирования каких-то объектов для горутин (для синхронизации).
Пример запуска операций в несколько потоков (горутин)
Papers
Как правильно организовать (паттерны) многопоточное приложение: Go Concurrency Pattern: https://talks.golang.org/2012/concurrency.slide Advanced Go Concurrency Patterns: https://talks.golang.org/2013/advconc.slide
Last updated