Sobes.tech
Junior — Middle

Je povolené odovzdávať segmenty slice do samostatných gorutín na paralelné spracovanie?

sobes.tech AI

Odpoveď od AI

Áno, prenášanie segmentov slice (rezov) do samostatných gorutín na paralelné spracovanie je povolené a často sa používa na paralelizáciu úloh. Je však dôležité si uvedomiť, že slices v Go sú referenčné typy, čo znamená, že viaceré gorutiny môžu odkazovať na ten istý základný poľom. Aby sa predišlo súťažiam, je potrebné zabezpečiť, že každá gorutina pracuje s unikátnym segmentom slice a nemení dáta používané inými gorutinami, alebo použiť synchronizáciu (napríklad mutex) pri spoločnom prístupe.

Príklad bezpečného prenášania segmentov slice do gorutín:

func processSegment(segment []int, wg *sync.WaitGroup) {
    defer wg.Done()
    // Spracovanie segmentu
}

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

V tomto príklade každá gorutina dostane samostatný segment slice, čo je bezpečné pre paralelné spracovanie.