Go в примерах: Горутины (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).

    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: каналы.

Следующий пример: Каналы (Channels).