就我而言,我有数千个 goroutines 同时作为work()
. 我也有一个sync()
goroutine。启动时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()
退出,我没有找到任何方法来重新打开一个关闭的频道。
我怀疑自己走错路了,因此感谢您提供任何帮助。是否有一些“优雅”的方式来暂停和恢复任何其他 goroutine?