一个关于go协程消费队列的问题

为什么最后输出的不是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  
    }  
阅读 2.1k
1 个回答

Println 是将内容输出的终端,这一个过程相对与 CPU 执行是非常慢的。你可以这么理解,当执行到 Println(7) 或者8的时候,系统就已经在输出内容了,但是此时你的程序已经执行完了。还没最终打印出来就终止了。你可以在主程序加 延时。就可以看到9了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题