Sobes.tech
Senior

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-ები)") } }