Sobes.tech
Junior — Middle

Πώς υλοποιείται η ασφαλής ανάγνωση δεδομένων από ένα κανάλι σε πολλαπλές goroutines ταυτόχρονα;

sobes.tech AI

Απάντηση από AI

Στη Go, για ασφαλή ανάγνωση από ένα κανάλι από πολλαπλές goroutines ταυτόχρονα, συνήθως χρησιμοποιούνται μία από τις ακόλουθες προσεγγίσεις:

  1. Ένας αποστολέας, πολλαπλοί δέκτες — δημιουργείται ένα κανάλι και πολλαπλές goroutines διαβάζουν από αυτό. Το κανάλι στη Go είναι ασφαλές για ταυτόχρονη ανάγνωση από πολλαπλές goroutines, οπότε μπορείτε απλά να ξεκινήσετε πολλές goroutines που διαβάζουν από το ίδιο κανάλι.

  2. Χρήση του sync.WaitGroup για συγχρονισμό — για να περιμένετε να ολοκληρώσουν όλες οι goroutines.

Παράδειγμα:

package main

import (
    "fmt"
    "sync"
)

func worker(id int, ch <-chan int, wg *sync.WaitGroup) {
    defer wg.Done()
    for val := range ch {
        fmt.Printf("Εργάτης %d έλαβε %d\n", id, val)
    }
}

func main() {
    ch := make(chan int)
    var wg sync.WaitGroup

    // Ξεκινάμε 3 goroutines που διαβάζουν από το κανάλι
    for i := 1; i <= 3; i++ {
        wg.Add(1)
        go worker(i, ch, &wg)
    }

    // Στέλνουμε δεδομένα στο κανάλι
    for i := 0; i < 10; i++ {
        ch <- i
    }
    close(ch) // Κλείνουμε το κανάλι ώστε να τερματίσουν οι goroutines

    wg.Wait() // Περιμένουμε να ολοκληρώσουν όλες οι goroutines
}

Έτσι, το κανάλι στη Go ήδη εξασφαλίζει ασφαλή πρόσβαση κατά την ανάγνωση από πολλαπλές goroutines, το κύριο είναι να διαχειριστούμε σωστά τον κύκλο ζωής τους και να κλείσουμε το κανάλι.