Sobes.tech
Senior

func (p *Pool) Stop() { p.mu.Unlock() // Այժմ անվտանգ է փակել ալիքը close(p.tasks) // ազդանշան աշխատողներին՝ նոր առաջադրանքներ չեն լինի, կարդացեք մնացորդը p.wg.Wait() // սպասում ենք բոլոր գորուտինների ավարտին p.cancel() // անհրաժեշտության դեպքում չեղյալ հայտարարում ենք կոնտեքստը fmt.Println("Pool կանգնեց.") } // ForceStop ուժեղորեն կանգնեցնում է բոլոր աշխատողներին՝ սպասելու Tasks-ի ավարտին չպահանջելով: // Աշխատողները անմիջապես կկտրվեն կոնտեքստի միջոցով: 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("Պուլը ուժեղորեն կանգնեցվեց (timeout, կարող են մնալ կախված goroutine-ներ)") } }