Existe alguma maneira elegante de pausar e retomar qualquer outra goroutine em golang?
No meu caso, eu tenho milhares de goroutines trabalhando simultaneamentework()
. Eu também tive umsync()
goroutine. Quandosync
Começa, eu preciso de qualquer outra goroutine para fazer uma pausa por um tempo depois de terminar o trabalho de sincronização. Aqui está o meu código:
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()
}
Agora o problema é, desde<-
está sempre bloqueando a leitura, toda vez vai parasync_stat := <- channel
está bloqueando. Eu sei que se o canal foi fechado não será bloqueado, mas desde que eu tenho que usar esse canal atéwork()
sai e não encontrei nenhuma maneira de reabrir um canal fechado.
Eu suspeito de mim mesmo de um jeito errado, então qualquer ajuda é apreciada. Existe alguma maneira "elegante" de pausar e retomar qualquer outra goroutine em golang?