func (p *Pool) Stop() {
p.mu.Unlock()
// Jetzt kann der Kanal sicher geschlossen werden
close(p.tasks) // Signal an die Worker: keine neuen Aufgaben, den Rest lesen
p.wg.Wait() // Warten, bis alle Goroutines beendet sind
p.cancel() // Kontext bei Bedarf abbrechen
fmt.Println("Pool gestoppt.")
}
// ForceStop stoppt alle Worker zwangsweise, ohne auf das Ende der Aufgaben zu warten.
// Die Worker werden sofort über den Kontext abgebrochen.
func (p *Pool) ForceStop(timeout time.Duration) {
fmt.Printf("Zwangsstopp des Pools (Timeout: %v)...\n", timeout)
// Blockiert das Hinzufügen neuer Aufgaben
p.mu.Lock()
p.isOpen = false
p.mu.Unlock()
// Schließt den Kanal, damit die Worker keine neuen Aufgaben mehr nehmen
close(p.tasks)
// Kontext abbrechen – das unterbricht alle laufenden Aufgaben
p.cancel()
// Begrenzte Zeit für den Abschluss
done := make(chan struct{})
go func() {
p.wg.Wait()
close(done)
}()
select {
case <-done:
fmt.Println("Pool zwangsweise gestoppt (alle Worker beendet)")
case <-time.After(timeout):
fmt.Println("Pool zwangsweise gestoppt (Timeout, es könnten hängen gebliebene Goroutines verbleiben)")
}
}