就我而言,我有数千个 goroutine 同时作为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?
不负相思意
相关分类