func (p *Pool) Stop() {
p.mu.Unlock()
// Teraz można bezpiecznie zamknąć kanał
close(p.tasks) // sygnał dla workerów: nie będzie nowych zadań, odczytaj resztę
p.wg.Wait() // czekaj na zakończenie wszystkich goroutine
p.cancel() // anuluj kontekst na wszelki wypadek
fmt.Println("Pool zatrzymany.")
}
// ForceStop wymusza zatrzymanie wszystkich workerów bez oczekiwania na zakończenie zadań.
// Workerzy zostaną natychmiast przerwani przez kontekst.
func (p *Pool) ForceStop(timeout time.Duration) {
fmt.Printf("Wymuszone zatrzymanie puli (timeout: %v)...\n", timeout)
// Blokuje dodawanie nowych zadań
p.mu.Lock()
p.isOpen = false
p.mu.Unlock()
// Zamknij kanał, aby workerzy nie brali nowych zadań
close(p.tasks)
// Anuluj kontekst – to przerwie wszystkie wykonywane zadania
p.cancel()
// Daj ograniczony czas na zakończenie
done := make(chan struct{})
go func() {
p.wg.Wait()
close(done)
}()
select {
case <-done:
fmt.Println("Pool wymuszenie zatrzymany (wszystkie worker zakończone)")
case <-time.After(timeout):
fmt.Println("Pool wymuszenie zatrzymany (timeout, mogą pozostać zawieszone goroutine)")
}
}