Nel mio caso, ho migliaia di goroutine che funzionano contemporaneamente come work()
. Ho anche avuto una goroutine sync()
. Quando inizia sync
, ho bisogno di un'altra goroutine per mettere in pausa per un po 'dopo che il processo di sincronizzazione è terminato. Ecco il mio codice:C'è un modo elegante per mettere in pausa e riprendere qualsiasi altra goroutine in golang?
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()
}
Ora il problema è, dal momento che è sempre <-
bloccando sul letto, ogni volta che va a sync_stat := <- channel
sta bloccando. So che se il canale è stato chiuso non verrà bloccato, ma poiché devo utilizzare questo canale fino alle uscite work()
e non ho trovato alcun modo per riaprire un canale chiuso.
Mi sospetto su un modo sbagliato, quindi qualsiasi aiuto è apprezzato. Esiste un modo "elegante" di mettere in pausa lo & riprendere qualsiasi altra goroutine in golang?
Cosa significa '<-time.After (1e1)'? –
Interrompe la goroutine per 1 secondo (1e9 nanosecondi). È usato in questo esempio per far sembrare che il controller stia facendo del lavoro reale. 'time.After()' restituisce un canale, che invia un segnale dopo il timeout specificato. '<-time.After (N)', blocca semplicemente su quel canale fino a quando quel segnale non viene ricevuto. – jimt
E questo mi fa capire un altro pensiero: perché non abbiamo semplicemente usato un valore globale che rappresenta lo stato del controller, e 'workers' controlla il valore globale ogni volta? So che non è una buona pratica, ma voglio sapere la ragione. –