func (p *Pool) Stop() {
p.mu.Unlock()
// Nu kan nu veilig de kanaal sluiten
close(p.tasks) // signaal aan de workers: geen nieuwe taken, lees de rest
p.wg.Wait() // wachten tot alle goroutines klaar zijn
p.cancel() // annuleer de context voor de zekerheid
fmt.Println("Pool gestopt.")
}
// ForceStop forceert het stoppen van alle workers zonder te wachten op het voltooien van taken.
// De workers worden onmiddellijk onderbroken via de context.
func (p *Pool) ForceStop(timeout time.Duration) {
fmt.Printf("Forceren van het stoppen van de pool (timeout: %v)...\n", timeout)
// Blokkeer het toevoegen van nieuwe taken
p.mu.Lock()
p.isOpen = false
p.mu.Unlock()
// Sluit het kanaal zodat de workers geen nieuwe taken meer nemen
close(p.tasks)
// Annuleer de context – dit onderbreekt alle lopende taken
p.cancel()
// Geef een beperkte tijd voor het afronden
done := make(chan struct{})
go func() {
p.wg.Wait()
close(done)
}()
select {
case <-done:
fmt.Println("Pool force gestopt (alle workers beëindigd)")
case <-time.After(timeout):
fmt.Println("Pool force gestopt (timeout, kunnen hangende goroutines blijven)")
}
}