Junior — Middle
Kuidas saab organiseerida ja hallata niitide täitmise järjekorda?
sobes.tech AI
Vastus AI-lt
Go keeles kasutatakse mitmeid peamisi mehhanisme gorutinite täitmise järjekorra korraldamiseks ja juhtimiseks:
-
Kanalid (channels) — võimaldavad gorutinite sünkroniseerimist, edastades andmeid nende vahel. Gorutiin, mis loeb kanalist, ootab, kuni teine gorutiin saadab andmed, tagades järjekorra.
-
sync.WaitGroup — kasutatakse gorutinite grupi lõpetamise ootamiseks. See võimaldab oodata, kuni kõik käivitatud gorutined lõpetavad.
-
Mutex ja teised primitives paketi sync — ühiste ressursside kaitsmiseks ja võistlusolukordade vältimiseks.
Näide kanalite kasutamisest järjestikuseks täitmiseks:
package main
import (
"fmt"
)
func worker(id int, done chan bool) {
fmt.Printf("Tööline %d alustas\n", id)
// töö simulatsioon
done <- true // lõpetamise signaal
}
func main() {
done := make(chan bool)
go worker(1, done)
<-done // ootame, kuni tööline 1 lõpetab
go worker(2, done)
<-done // ootame, kuni tööline 2 lõpetab
fmt.Println("Kõik töömehed on lõpetanud")
}
Sellisel viisil saab kanalite ja sünkroniseerimise abil juhtida gorutinite täitmise järjekorda.