Sobes.tech
Junior

Για ποιο λόγο χρησιμοποιείται το WaitGroup στο Go;

sobes.tech AI

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

Το WaitGroup χρησιμοποιείται για τον συγχρονισμό της εργασίας μιας ή πολλών goroutines. Επιτρέπει στη κύρια goroutine να περιμένει την ολοκλήρωση άλλων δημιουργημένων goroutines. Αποτελείται από έναν μετρητή που αυξάνεται κατά τη δημιουργία μιας goroutine και μειώνεται όταν αυτή ολοκληρώνεται.

Βασικές μέθοδοι:

  • Add(delta int): Αυξάνει ή μειώνει τον μετρητή των goroutines.
  • Done(): Μειώνει τον μετρητή κατά 1. Καλείται συνήθως στο τέλος μιας goroutine (συχνά με defer).
  • Wait(): μπλοκάρει την εκτέλεση μέχρι ο μετρητής να γίνει μηδέν.

Παράδειγμα χρήσης:

package main

import (
	"fmt"
	"sync"
)

func worker(id int, wg *sync.WaitGroup) {
	defer wg.Done() // Μειώνει τον μετρητή στο τέλος της goroutine

	fmt.Printf("Goroutine %d ξεκινά\n", id)
	// Προσομοίωση εργασίας
	// time.Sleep(time.Second)
	fmt.Printf("Goroutine %d ολοκληρώθηκε\n", id)
}

func main() {
	var wg sync.WaitGroup // Δημιουργία WaitGroup

	for i := 1; i <= 5; i++ {
		wg.Add(1) // Αυξάνουμε τον μετρητή για κάθε goroutine
		go worker(i, &wg) // Ξεκινάμε τη goroutine, περνώντας δείκτη στο WaitGroup
	}

	wg.Wait() // Περιμένουμε μέχρι ο μετρητής να γίνει 0 (όλες οι goroutines ολοκληρώνονται)
	fmt.Println("Όλες οι goroutines ολοκληρώθηκαν")
}