goroutine1 е лека нишка2 на изпълнение.
import (
"fmt"
"time"
)
func f(from string) {
for i := range 3 {
fmt.Println(from, ":", i)
}
}
func main() {
Да предположим, че извикваме функция f(s) по
обичайния начин - в потока на програмата ни.
f("пряко извикване")
За да извикаме тази функция като отделна нишка в
Го, пишем go f(s). Тази нова „гозадача“ ще се
изпълни едновременно с извикващата я (главната
нишка).
go f("извикване в отделна go-нишка")
Можете да пуснете нова гозадача с безименна функция.
go func(msg string) {
fmt.Println(msg)
}("върви")
Двете ни извикани функции сега работят независимо една от друга в отделни нишки (потоци) на изпълнение. Изчакваме ги да завършат. По-мощен подход е да ползваме WaitGroup.
time.Sleep(time.Second)
fmt.Println("готово")
}
Когато пуснем тази програма, ще видим първо изхода от блокиращото извикване, след това изхода от две гозадачи. Изходът от гозадачите може да се смеси, защото са пуснати едновременно от двигателя за изпълнение1 на Го.
$ go run goroutines.go
пряко извикване : 0
пряко извикване : 1
пряко извикване : 2
извикване в отделна go-нишка : 0
върви
извикване в отделна go-нишка : 1
извикване в отделна go-нишка : 2
готово
В следващия пример ще разгледаме едно допълнение към гозадачите – канали.
Следващ пример: Канали (chan).