Junior — Middle
Vai ir atļauts pārsūtīt sērijas segmentus (slice) uz atsevišķām goroutines paralēlai apstrādei?
sobes.tech AI
Atbilde no AI
Jā, segmentu (sagriezienu) nodošana atsevišķām gorutīnām paralēlai apstrādei ir atļauta un bieži tiek izmantota uzdevumu paralelizācijai. Tomēr ir svarīgi atcerēties, ka Go slices ir atsauces tipi, tas nozīmē, ka vairākas gorutīnas var atsaukties uz to pašu pamata masīvu. Lai novērstu sacensību apstākļus, ir jānodrošina, ka katra gorutīna strādā ar unikālu slice segmentu un nemaina citu gorutīnu izmantotos datus, vai arī izmantot sinhronizāciju (piemēram, mutex) kopīgai piekļuvei.
Drošs slice segmentu nodošanas piemērs gorutīnām:
func processSegment(segment []int, wg *sync.WaitGroup) {
defer wg.Done()
// Segmenta apstrāde
}
func main() {
data := []int{1, 2, 3, 4, 5, 6, 7, 8}
var wg sync.WaitGroup
segmentSize := 2
for i := 0; i < len(data); i += segmentSize {
end := i + segmentSize
if end > len(data) {
end = len(data)
}
wg.Add(1)
go processSegment(data[i:end], &wg)
}
wg.Wait()
}
Šajā piemērā katra gorutina saņem atsevišķu slice segmentu, kas ir droši paralēlai apstrādei.