func (p *Pool) Stop() {
p.mu.Unlock()
// İndi kanal təhlükəsiz şəkildə bağlana bilər
close(p.tasks) // işçilərə siqnal: yeni tapşırıq olmayacaq, qalanını oxu
p.wg.Wait() // bütün gorutinaların tamamlanmasını gözləyirik
p.cancel() // ehtiyat üçün konteksti ləğv et
fmt.Println("Pool dayandırıldı.")
}
// ForceStop bütün işçiləri tapşırıqlar tamamlanmadan zorla dayandırır.
// İşçilər dərhal kontekst vasitəsilə kəsiləcək.
func (p *Pool) ForceStop(timeout time.Duration) {
fmt.Printf("Pool-u zorla dayandırma (zaman aşımı: %v)...\n", timeout)
// Yeni tapşırıqların əlavə olunmasını bloklayır
p.mu.Lock()
p.isOpen = false
p.mu.Unlock()
// Kanalı bağlayır ki, işçilər yeni tapşırıq götürməsin
close(p.tasks)
// Konteksti ləğv et – bu, bütün yerinə yetirilən tapşırıqları kəsəcək
p.cancel()
// Tamamlama üçün məhdud vaxt verilir
done := make(chan struct{})
go func() {
p.wg.Wait()
close(done)
}()
select {
case <-done:
fmt.Println("Pool zorla dayandırıldı (bütün işçilər tamamlandı)")
case <-time.After(timeout):
fmt.Println("Pool zorla dayandırıldı (zaman aşımı, asılı qalan gorutinalar qala bilər)")
}
}