Czy jest jakiś elegancki sposób na wstrzymanie i wznowienie każdego innego goroutine w golang?
W moim przypadku mam tysiące goroutinów działających jednocześniework()
. Miałem teżsync()
goroutine. Gdysync
zaczynam, potrzebuję innego goroutine, aby zatrzymać się na chwilę po zakończeniu synchronizacji. Oto mój kod:
var channels []chan int
var channels_mutex sync.Mutex
func work() {
channel := make(chan int, 1)
channels_mutex.Lock()
channels = append(channels, channel)
channels_mutex.Unlock()
for {
for {
sync_stat := <- channel // blocked here
if sync_stat == 0 { // if sync complete
break
}
}
// Do some jobs
if (some condition) {
return
}
}
}
func sync() {
channels_mutex.Lock()
// do some sync
for int i := 0; i != len(channels); i++ {
channels[i] <- 0
}
channels_mutex.Unlock()
}
Teraz problem polega na tym<-
zawsze blokuje czytanie, za każdym razemsync_stat := <- channel
blokuje. Wiem, że jeśli kanał został zamknięty, nie zostanie zablokowany, ale ponieważ muszę używać tego kanału, aż dowork()
wychodzi, a ja nie znalazłem żadnego sposobu na ponowne otwarcie zamkniętego kanału.
Podejrzewam siebie w niewłaściwy sposób, więc każda pomoc jest doceniana. Czy jest jakiś „elegancki” sposób na zatrzymanie i wznowienie każdego innego goroutine w golang?