创建channel时,可以制定chanel的缓存:
c := make(chan int) 这种情况下缓存为1
c := make(chan int, num) 创建缓存为num的channel
为了灵活控制程序中协程的个数,可以通过创建一个带缓存的channel,在启动一个新的goroutine时,往channel中写入一个数据,然后在协程完成的时候读出来,实现控制协程个数等同于channel缓存大小的效果。
func RunClean() {
cfg := initConfig()
//初始化一个带缓存的chanel
workerChan := make(chan int, cfg.WorkerNum)
namespaces, err := QueryNamespaces()
if err != nil {
log.Error("Get namespaces error: ", err)
return
}
step := cfg.Step
last, err := QueryLastItem()
if err != nil {
log.Error("Get last item error:", err)
return
}
for i := 0; i < last; i += step {
//往channel中写入一个数字
workerChan <- 1
go Clean(int64(i), int64(i + Step))
}
}
}
}
func Clean(beginId, endId int64) {
cfg := &CleanTaskConfig{
BeginId: beginId,
EndId: endId,
}
if t, err := NewCleanTask(cfg); err == nil {
t.CleanItems()
}
//当一个协程完成的时候,从chanel中读一个数字
<-workerChan
}