Bunu yapmanın bir başka yolu da dahili olarak izlemek, sorunuzu sınırlamaktır ancak sizin için çalışmayı yeniden düzenleyemeseniz bile bir döngüde goroutinesinize başladığınızı varsayacağım. ancak bu 2 örneklerden birini yapabileceği, ilki bireysel olarak zaman aşımına uğramasına her isteği zaman aşımına uğrar ve ikincisi istekleri topluluğunun tamamını aşımı ve çok fazla zaman
var wg sync.WaitGroup
wg.Add(1)
go func() {
success := make(chan struct{}, 1)
go func() {
// send your request and wait for a response
// pretend response was received
time.Sleep(5 * time.Second)
success <- struct{}{}
// goroutine will close gracefully after return
fmt.Println("Returned Gracefully")
}()
select {
case <-success:
break
case <-time.After(1 * time.Second):
break
}
wg.Done()
// everything should be garbage collected and no longer take up space
}()
wg.Wait()
// do whatever with what you got
fmt.Println("Done")
time.Sleep(10 * time.Second)
fmt.Println("Checking to make sure nothing throws errors after limbo goroutine is done")
geçtiyse hareket Ya eğer olacak TÜM isteklerinizi zaman aşımına uğramak için genel bir kolaylık istersiniz
var wg sync.WaitGroup
waiter := make(chan int)
wg.Add(1)
go func() {
success := make(chan struct{}, 1)
go func() {
// send your request and wait for a response
// pretend response was received
time.Sleep(5 * time.Second)
success <- struct{}{}
// goroutine will close gracefully after return
fmt.Println("Returned Gracefully")
}()
select {
case <-success:
break
case <-time.After(1 * time.Second):
// control the timeouts for each request individually to make sure that wg.Done gets called and will let the goroutine holding the .Wait close
break
}
wg.Done()
// everything should be garbage collected and no longer take up space
}()
completed := false
go func(completed *bool) {
// Unblock with either wait
wg.Wait()
if !*completed {
waiter <- 1
*completed = true
}
fmt.Println("Returned Two")
}(&completed)
go func(completed *bool) {
// wait however long
time.Sleep(time.Second * 5)
if !*completed {
waiter <- 1
*completed = true
}
fmt.Println("Returned One")
}(&completed)
// block until it either times out or .Wait stops blocking
<-waiter
// do whatever with what you got
fmt.Println("Done")
time.Sleep(10 * time.Second)
fmt.Println("Checking to make sure nothing throws errors after limbo goroutine is done")
012 senin WaitGroup senkronize kalacak ve belirsizlik içinde kalan herhangi goroutines olmaz
Bu şekilde
http://play.golang.org/p/g0J_qJ1BUT
etrafında değişkenleri değiştirebilir burada denemek o farklı
Edit çalıştığını görmek: hattayım mobil Herkes biçimlendirmeyi düzeltebilecekse, teşekkürler.
Eğer bir döngü ya aracılığıyla bunu yapıyor gibi demeniz bekleme grupları ve malzeme ekleyerek nasıl gönderebilir miyim ?? – Datsik
Olası kopyası [Timeout for WaitGroup.Wait()] (http://stackoverflow.com/questions/32840687/timeout-for-waitgroup-wait) – jab