func (p *Pool) Stop() {
p.mu.Unlock()
// ახლა უსაფრთხოდ შეიძლება ჩაკეტოთ არხი
close(p.tasks) // სიგნალი მუშაკებს: ახალი დავალებები აღარ იქნება, წაიკითხეთ დარჩენილი
p.wg.Wait() // ველით ყველა გორუტინის დასრულებას
p.cancel() // საჭიროების შემთხვევაში გაუქმეთ კონტექსტი
fmt.Println("Pool შეჩერებულია.")
}
// ForceStop ძალით აჩერებს ყველა მუშაკს დავალებების დასრულების მოლოდინის გარეშე.
// მუშაკები დაუყოვნებლივ გაწყდება კონტექსტის მეშვეობით.
func (p *Pool) ForceStop(timeout time.Duration) {
fmt.Printf("ძალადობრივი გაჩერება პულის (timeout: %v)...\n", timeout)
// ბლოკავს ახალი დავალებების დამატებას
p.mu.Lock()
p.isOpen = false
p.mu.Unlock()
// არხის დახურვა, რათა მუშაკებმა ახალი დავალებები არ მიიღონ
close(p.tasks)
// კონტექსტის გაუქმება – ეს ყველა მიმდინარე დავალებას გაწყდება
p.cancel()
// შეზღუდული დრო მიცემულია დასრულებისთვის
done := make(chan struct{})
go func() {
p.wg.Wait()
close(done)
}()
select {
case <-done:
fmt.Println("პული ძალით გაჩერებულია (ყველა მუშაკი დასრულდა)")
case <-time.After(timeout):
fmt.Println("პული ძალით გაჩერებულია (тайმ-აუტ, შეიძლება დარჩეს გაჩერებული goroutine-ები)")
}
}