Czy jest jakiś elegancki sposób na wstrzymanie i wznowienie każdego innego goroutine w golang?

W moim przypadku mam tysiące goroutinów działających jednocześniework(). Miałem teżsync() goroutine. Gdysync zaczynam, potrzebuję innego goroutine, aby zatrzymać się na chwilę po zakończeniu synchronizacji. Oto mój kod:

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()
}

Teraz problem polega na tym<- zawsze blokuje czytanie, za każdym razemsync_stat := <- channel blokuje. Wiem, że jeśli kanał został zamknięty, nie zostanie zablokowany, ale ponieważ muszę używać tego kanału, aż dowork() wychodzi, a ja nie znalazłem żadnego sposobu na ponowne otwarcie zamkniętego kanału.

Podejrzewam siebie w niewłaściwy sposób, więc każda pomoc jest doceniana. Czy jest jakiś „elegancki” sposób na zatrzymanie i wznowienie każdego innego goroutine w golang?

questionAnswers(1)

yourAnswerToTheQuestion