func (p *Pool) Stop() {
p.mu.Unlock()
// Τώρα είναι ασφαλές να κλείσουμε το κανάλι
close(p.tasks) // σήμα στους εργαζόμενους: δεν θα υπάρχουν νέες εργασίες, διαβάστε το υπόλοιπο
p.wg.Wait() // περιμένουμε να ολοκληρωθούν όλα τα goroutines
p.cancel() // ακυρώνουμε το πλαίσιο, αν χρειάζεται
fmt.Println("Pool σταμάτησε.")
}
// ForceStop αναγκαστικά σταματά όλους τους εργαζόμενους χωρίς να περιμένει την ολοκλήρωση των εργασιών.
// Οι εργαζόμενοι θα διακοπούν αμέσως μέσω του πλαισίου.
func (p *Pool) ForceStop(timeout time.Duration) {
fmt.Printf("Αναγκαστική διακοπή του pool (timeout: %v)...\n", timeout)
// Μπλοκάρει την προσθήκη νέων εργασιών
p.mu.Lock()
p.isOpen = false
p.mu.Unlock()
// Κλείνει το κανάλι ώστε οι εργαζόμενοι να μην πάρουν νέες εργασίες
close(p.tasks)
// Ακυρώνουμε το πλαίσιο – αυτό θα διακόψει όλες τις τρέχουσες εργασίες
p.cancel()
// Δίνουμε περιορισμένο χρόνο για να ολοκληρωθούν
done := make(chan struct{})
go func() {
p.wg.Wait()
close(done)
}()
select {
case <-done:
fmt.Println("Pool αναγκαστικά σταμάτησε (όλοι οι εργαζόμενοι τερματίστηκαν)")
case <-time.After(timeout):
fmt.Println("Pool αναγκαστικά σταμάτησε (timeout, ενδέχεται να παραμείνουν goroutines σε αναμονή)")
}
}