Sobes.tech
Junior

Τι είναι το WaitGroup στο Go και πού χρησιμοποιείται;

sobes.tech AI

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

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

Χρησιμοποιείται για:

  • Την αναμονή όλων των goroutines να ολοκληρωθούν πριν από την έξοδο από τη λειτουργία ή το πρόγραμμα.
  • Τον συντονισμό της εργασίας μεταξύ πολλών goroutines.

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

package main

import (
	"fmt"
	"sync"
	"time"
)

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

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

func main() {
	var wg sync.WaitGroup // Δηλώνουμε ένα WaitGroup
	numWorkers := 3

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

	wg.Wait() // Μπλοκάρει την εκτέλεση του main μέχρι ο μετρητής να γίνει 0
	fmt.Println("Όλοι οι εργάτες ολοκλήρωσαν")
}

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

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