Goroutines

Горутины (Goroutines)|Goroutines #

// _Горутины_ - это легковесный тред.

package main

import (
	"fmt"
	"time"
)

func f(from string) {
	for i := 0; i < 3; i++ {
		fmt.Println(from, ":", i)
	}
}

func main() {

	// Предположим, у нас есть вызов функции `f(s)`. Вот
	// как мы бы вызвали её обычным способом, запустив
	// синхронно.
	f("direct")

	// Чтобы вызвать эту функцию в горутине, используйте
	// `go f(s)`. Эта новая горутина будет выполняться
	// одновременно с вызывающей фукнцией.
	go f("goroutine")

	// Вы так же можете вызывать анонимные функции в
	// горутнах.
	go func(msg string) {
		fmt.Println(msg)
	}("going")

	// Наши две функции теперь выполняются асинхронно в
	// отдельных горутинах. Дождитесь их окончания (для
	// более надежного подхода используйте [WaitGroup](waitgroups)).
	time.Sleep(time.Second)
	fmt.Println("done")
}
# Когда мы запускаем эту программу, мы видим сначала
# вывод блокирующего вызова, а затем чередующийся вывод
# двух горутин. Это чередование отражает выполнение
# горутин, одновременно выполняемых средой выполнения Go.
$ go run goroutines.go
direct : 0
direct : 1
direct : 2
goroutine : 0
going
goroutine : 1
goroutine : 2
done

# Далее мы рассмотрим дополнение к горутинам в
# параллельных программах Go: каналы.