golang goroutine 骚操作系列 CallerRunsPolicy


func taskQueueJob(id int, wg *sync.WaitGroup, ch chan struct{}, maxChan chan struct{}) {
    defer func() {
        <-ch // 任务完成后从通道中取出一个元素
        <-maxChan
        wg.Done()
    }()
    task(id)

}
func task(id int) {
    fmt.Printf("Task %d is running...\n", id)
    time.Sleep(1 * time.Second)
    fmt.Printf("Task %d has been completed\n", id)
}

func main() {
    taskQueue := make(chan struct{}, 10)
    maxTask := make(chan struct{}, 2)
    wg := sync.WaitGroup{}
    for i := 1; i <= 15; i++ {
        select {
        case taskQueue <- struct{}{}:
            maxTask <- struct{}{}
            wg.Add(1)
            go taskQueueJob(i, &wg, taskQueue, maxTask)
        default:
            fmt.Printf("Task %d is executed by the main process\n", i)
            task(i)
        }
    }

    close(taskQueue)
    wg.Wait()
    close(maxTask)

}
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!