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