Sobes.tech
Junior — Middle

Kas on lubatud saata lõike (slice) sektsioone eraldi goroutine'idele paralleelseks töötlemiseks?

sobes.tech AI

Vastus AI-lt

Jah, segmentide (viilud) edasiandmine eraldi goroutine'idele paralleelseks töötlemiseks on lubatud ja sageli kasutatakse ülesannete paralleelimiseks. Kuid oluline on meeles pidada, et Go-s on slices viidete tüübid, mis tähendab, et mitu goroutine'i võivad viidata samale aluseks olevale massiivile. Vältimaks võistlusolukordi, tuleb tagada, et iga goroutine töötab unikaalse slice-segmendiga ning ei muuda teiste goroutine'ide kasutatavaid andmeid, või kasutada sünkroniseerimist (näiteks mutex) ühise juurdepääsu korral.

Turvalise slice-segmendi edastamise näide goroutine'idele:

func processSegment(segment []int, wg *sync.WaitGroup) {
    defer wg.Done()
    // Segmendi töötlemine
}

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()
}

Selles näites saab iga goroutine eraldi slice-segmendi, mis on turvaline paralleelseks töötlemiseks.