Parallel oqimlar
Go dasturlash tilida goroutine — bu bir vaqtning o'zida bir nechta amallarni mustaqil va parallel bajarish imkonini beruvchi juda yengil vaznli (lightweight) oqimdir (concurrency).
Oddiy dasturlarda funksiyalar ketma-ket (sinxron) bajariladi: bitta funksiya to'liq tugamaguncha ikkinchisi boshlanmaydi. Goroutinelar yordamida esa bir nechta mustaqil funksiyalarni parallel (asinxron) ishga tushirish mumkin.
go kalit so'zi)Oddiy funksiyani goroutine sifatida ishga tushirish uchun uning chaqiruvi oldiga go kalit so'zini qo'yish yetarli:
func display() {
// kod
}
// Goroutine sifatida ishga tushiramiz
go display()
main)package main
import (
"fmt"
"time"
)
func display(message string) {
fmt.Println(message)
}
func main() {
// Goroutine sifatida chaqiramiz
go display("1-jarayon")
// Oddiy sinxron chaqiruv
display("2-jarayon")
}
Natija:
2-jarayon
[!NOTE] Nega
1-jarayonchiqmadi? Chunkimain()funksiyasining o'zi ham bosh (standart) goroutinedir.go display("1-jarayon")fon rejimiga o'tishi bilanmain()o'z ishini tugatib qo'ydi va dastur yopildi. Goroutine ulgurishi uchunmain()biroz kutib turishi kerak.

Keling, time.Sleep() yordamida ikkala jarayonning parallel almashib ishlashini ko'ramiz:
package main
import (
"fmt"
"time"
)
func display(message string) {
for i := 1; i <= 3; i++ {
fmt.Println(message, i)
// Jarayonni 1 soniyaga to'xtatib turamiz
time.Sleep(time.Millisecond * 500)
}
}
func main() {
// 1-jarayonni goroutine sifatida boshlaymiz
go display("1-jarayon")
// 2-jarayonni oddiy ishga tushiramiz
display("2-jarayon")
}
Natija:
2-jarayon 1
1-jarayon 1
2-jarayon 2
1-jarayon 2
2-jarayon 3
1-jarayon 3
Ikkala funksiya ham bir vaqtda parallel ishlayotganini ko'rishimiz mumkin.
Bir vaqtning o'zida istalgancha goroutine ishga tushirish mumkin. Ularning bajarilish tartibini operatsion tizim va Go rejalashtiruvchisi (Go Scheduler) belgilaydi, shuning uchun natijalar ketma-ketligi ixtiyoriy (random) bo'lishi mumkin:
package main
import (
"fmt"
"time"
)
func display(message string) {
fmt.Println(message)
}
func main() {
go display("1-jarayon")
go display("2-jarayon")
go display("3-jarayon")
// main() tugab qolmasligi uchun 1 soniya kutamiz
time.Sleep(time.Second * 1)
}
Ehtimoliy Natija:
3-jarayon
1-jarayon
2-jarayon
2 KB) xotira bilan ish boshlaydi. Bitta dasturda yuz minglab goroutinelarni qiynalmasdan ishlatish mumkin.