В моем случае у меня есть тысячи goroutines, работающих одновременно как work()
. У меня также был gotoutine sync()
. Когда начинается sync
, мне нужно, чтобы какой-либо другой goroutine приостановился некоторое время после выполнения задания синхронизации. Вот мой код:
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()
}
Теперь проблема заключается в том, что <-
всегда блокирует чтение, каждый раз, когда идет sync_stat := <- channel
, блокируется. Я знаю, что если канал был закрыт, он не будет заблокирован, но поскольку я должен использовать этот канал до выхода work()
, и я не нашел способа открыть закрытый канал.
Я подозреваю, что я ошибался, поэтому любая помощь приветствуется. Есть ли какой-то "изящный" способ сделать паузу и возобновить любой другой горутин в голанге?