在我的例子中,我有数千个Goroutine同时工作,相当于work()
个.我也有一辆sync()
号大猩猩.当sync
启动时,我需要任何其他Goroutine在同步作业(job)完成后暂停一段时间.以下是我的代码:
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()
个出口,我没有找到任何方法重新打开一个关闭的通道.
我怀疑自己走错了路,所以任何帮助都很感激.有没有什么"优雅"的方式来暂停和恢复任何其他的大猩猩表演?