Sobes.tech
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.