Go за Прикладом: Горутини (Goroutines)

Work in Progress / Сайт в процесі розробки

goroutine (надалі просто горутина) це легковісний потік виконання.

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")

time.Sleep(time.Millisecond) - створить паузу у виконанні, щоб ми дочекались результатів роботи вже запущених горутин.

    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

Канали, є доповненням до горутин у механізмах одночасного виконання реалізованих у Go.

Наступний приклад: Канали (Channels).