Gibt es eine elegante Möglichkeit, eine andere Goroutine in Golang anzuhalten und fortzusetzen?
In meinem Fall arbeiten Tausende von Goroutinen gleichzeitig alswork()
. Ich hatte auch einesync()
Goroutine. Wannsync
Startet, ich brauche eine andere Goroutine, um eine Weile zu pausieren, nachdem die Synchronisierung abgeschlossen ist. Hier ist mein Code:
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()
}
Jetzt ist das Problem da<-
wird beim lesen immer blockiert, geht jedes mal aufsync_stat := <- channel
blockiert. Ich weiß, wenn der Kanal geschlossen wurde, wird er nicht blockiert, aber da ich diesen Kanal erst verwenden musswork()
Ausgänge, und ich fand keine Möglichkeit, einen geschlossenen Kanal wieder zu öffnen.
Ich vermute, dass ich falsch liege, daher ist jede Hilfe willkommen. Gibt es eine "elegante" Möglichkeit, eine andere Goroutine in Golang anzuhalten und fortzusetzen?