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

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

Наші два виклики функції працюють асинхронно у окремих горутинах, зачекаємо поки вони завершаться. Для більш стабільної роботи скористайтесь WaitGroup’ами.

    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

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

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