Goroutines

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

// _goroutine_ (надалі просто _горутина_) це легковісний [потік виконання](https://uk.wikipedia.org/wiki/Потік_(інформатика)).

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.Millisecond)
	fmt.Println("done")
}
# Коли ми запустимо нашу програму, ми побачимо
# спершу результат блокуючого виклику, а вже
# потім результат виконання  двох горутин.
# Як ми можете помітити, обидві горутини
# виконуються одночасно ії виконання контролюється
# середовищем виконання Go.
$ go run goroutines.go
direct : 0
direct : 1
direct : 2
goroutine : 0
going
goroutine : 1
goroutine : 2
done

# На додаток до механізмів асинхронного виконання,
# таких як горутини, ми зараз розгялнемо _Канали_.