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?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage