为什么最后输出的不是1~9,而是1~7或者1~8呢
cpu_amount := 1
jobChan := make(chan int, cpu_amount)
finishChan := make(chan int, 1)
dateRange := []int{1,2,3,4,5,6,7,8,9}
var finishNum int
dateNum := len(dateRange)
// 协程消费
for i := 0; i < cpu_amount; i++ {
go func() {
if finishNum == dateNum {
return
}
for job := range jobChan {
fmt.Println(job)
finishChan <- 1
}
}()
}
// 执行进度
go func() {
for {
if finishNum == dateNum {
break
}
<-finishChan
finishNum++
}
}()
// 生产任务
for _, date := range dateRange {
jobChan <- date
}
Println 是将内容输出的终端,这一个过程相对与 CPU 执行是非常慢的。你可以这么理解,当执行到 Println(7) 或者8的时候,系统就已经在输出内容了,但是此时你的程序已经执行完了。还没最终打印出来就终止了。你可以在主程序加 延时。就可以看到9了