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