func (p *Pool) Stop() {
p.mu.Unlock()
// Artık kanalı güvenle kapatabiliriz
close(p.tasks) // işçilere sinyal: yeni görev yok, kalanını okuyun
p.wg.Wait() // tüm goroutine'lerin tamamlanmasını bekle
p.cancel() // gerekirse bağlamı iptal et
fmt.Println("Havuz durduruldu.")
}
// ForceStop, tüm işçileri görevlerin tamamlanmasını beklemeden zorla durdurur.
// İşçiler, bağlam aracılığıyla hemen kesilecektir.
func (p *Pool) ForceStop(timeout time.Duration) {
fmt.Printf("Havuzu zorla durdurma (zaman aşımı: %v)...\n", timeout)
// Yeni görev eklemeyi engelle
p.mu.Lock()
p.isOpen = false
p.mu.Unlock()
// Kanalı kapat, böylece işçiler yeni görev almayacak
close(p.tasks)
// Bağlamı iptal et – bu, tüm çalışan görevleri durduracaktır
p.cancel()
// Sınırlı süre ver, tamamlaması için
done := make(chan struct{})
go func() {
p.wg.Wait()
close(done)
}()
select {
case <-done:
fmt.Println("Havuz zorla durduruldu (tüm işçiler tamamlandı)")
case <-time.After(timeout):
fmt.Println("Havuz zorla durduruldu (zaman aşımı, takılı kalan goroutines olabilir)")
}
}