¿Hay alguna forma elegante de pausar y reanudar cualquier otra goroutina en Golang?
En mi caso, tengo miles de goroutines trabajando simultáneamente comowork()
. También tuve unsync()
goroutine Cuandosync
comienza, necesito cualquier otra goroutina para hacer una pausa por un tiempo después de que se realiza el trabajo de sincronización. Aquí está mi 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()
}
Ahora el problema es, ya que<-
Siempre está bloqueando en lectura, cada vez que va async_stat := <- channel
esta bloqueando Sé que el canal se cerró, no se bloqueará, pero como tengo que usar este canal hastawork()
sale, y no encontré ninguna manera de volver a abrir un canal cerrado.
Sospecho de mí mismo de una manera incorrecta, por lo que cualquier ayuda es apreciada. ¿Hay alguna forma "elegante" de pausar y reanudar cualquier otra goroutina en Golang?