func (p *Pool) Stop() {
p.mu.Unlock()
// Tagad ir droši aizvērt kanālu
close(p.tasks) // signāls darbiniekiem: jaunu uzdevumu nebūs, lasiet pārējo
p.wg.Wait() // gaidām, līdz visas goroutines pabeigsies
p.cancel() // gadījumā atceļam kontekstu
fmt.Println("Pool apturēts.")
}
// ForceStop piespiedu kārtā aptur visus darbiniekus, nesagaidot uzdevumu pabeigšanu.
// Darbinieki tiks nekavējoties pārtraukti caur kontekstu.
func (p *Pool) ForceStop(timeout time.Duration) {
fmt.Printf("Piesaistes apturēšana (laika limits: %v)...\n", timeout)
// Bloķē jaunu uzdevumu pievienošanu
p.mu.Lock()
p.isOpen = false
p.mu.Unlock()
// Aizver kanālu, lai darbinieki neņemtu jaunus uzdevumus
close(p.tasks)
// Atceļ kontekstu – tas pārtrauks visus pašreizējos uzdevumus
p.cancel()
// Dod ierobežotu laiku pabeigšanai
done := make(chan struct{})
go func() {
p.wg.Wait()
close(done)
}()
select {
case <-done:
fmt.Println("Pool piespiedu kārtā apturēts (visi darbinieki pabeiguši)")
case <-time.After(timeout):
fmt.Println("Pool piespiedu kārtā apturēts (laika limits, var palikt pakarēju goroutine)")
}
}