Hogyan lehet szervezni és kezelni a szálak végrehajtási sorrendjét?
sobes.tech MI
Válasz az MI-től
Go nyelven a goroutine-ok végrehajtási sorrendjének szervezéséhez és kezeléséhez több fő mechanizmust használnak:
-
Csatornák (channels) — lehetővé teszik a goroutine-ok szinkronizálását, adatátvitelt közöttük. Egy goroutine, amely olvas egy csatornából, várni fog, amíg egy másik goroutine adatot küld, ez biztosítja a sorrendet.
-
sync.WaitGroup — arra szolgál, hogy várjon egy goroutine-csoport befejezésére. Lehetővé teszi, hogy megvárd, amíg az összes indított goroutine befejeződik.
-
Mutex és más primitívek a sync csomagból — a közös erőforrások védelmére és a versenyhelyzetek elkerülésére.
Példa a csatornák használatára szekvenciális végrehajtáshoz:
package main
import (
"fmt"
)
func worker(id int, done chan bool) {
fmt.Printf("Munkás %d elindult\n", id)
// munka szimulálása
done <- true // befejezés jelzése
}
func main() {
done := make(chan bool)
go worker(1, done)
<-done // várakozás az 1-es munkás befejezésére
go worker(2, done)
<-done // várakozás a 2-es munkás befejezésére
fmt.Println("Minden munkás befejeződött")
}
Így a csatornák és a szinkronizáció segítségével kezelhető a goroutine-ok végrehajtási sorrendje.