用go的goroutine和channel實現一個簡單的“生產、消費”(帶有超時控制)小例子

直接上代碼

1、沒有超時的時候

package main

import (
    "fmt"
    "time"
)

func main() {
    //存放生產的channel
    jobChan := make(chan int, 100)
    //通知是否完成所有任務
    endChan := make(chan bool)

    go production(jobChan)
    go worker(jobChan, endChan)

    select {
    case <-endChan:
        fmt.Println("消費完成……………………")
        return
    case <-time.After(time.Second * 20):
        fmt.Println("超時………………………")
        return
    }
}
//消費
func worker(jobChan <-chan int, endChan chan bool) {
    for job := range jobChan {
        fmt.Println("消費:", job)
    }
    //消費結束,通知endChan
    endChan <- true
}

//生產
func production(jobChan chan<- int) {
    for i := 1; i <= 10; i++ {
        fmt.Println("生產:", i)
        jobChan <- i
    }
    //關閉channel防止消費阻塞
    close(jobChan)
}

執行結果 :
這裏寫圖片描述
可見生產和消費異步併發執行。

2、當超時時 (timeout設置小點,並增加消費處理時間)

package main

import (
    "fmt"
    "time"
)


func main() {
    //存放生產的channel
    jobChan := make(chan int, 100)
    //通知是否完成所有任務
    endChan := make(chan bool)

    go production(jobChan)
    go worker(jobChan, endChan)

    select {
    case <-endChan:
        fmt.Println("消費完成……………………")
        return
    case <-time.After(time.Second * 5):
        fmt.Println("超時………………………")
        return
    }
}
//消費
func worker(jobChan <-chan int, endChan chan bool) {
    for job := range jobChan {
        fmt.Println("消費:", job)
        //增加消費處理時間
        time.Sleep(1 * time.Second)
    }
    //消費結束,通知endChan
    endChan <- true
}

//生產
func production(jobChan chan<- int) {
    for i := 1; i <= 10; i++ {
        fmt.Println("生產:", i)
        jobChan <- i
    }
    //關閉channel防止消費阻塞
    close(jobChan)
}

執行結果
這裏寫圖片描述
5秒之後超時(此時隊列裏尚有未處理完的數據)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章