1. 程式人生 > >goroutine/channel(select、定時器)

goroutine/channel(select、定時器)

往裏面 ack ann package var 不出 i++ 用戶 time

應用場景舉例:
一個任務管道滿了,再往裏面塞就塞不進去了,瀏覽器刷不出來了。用戶即便關了瀏覽器可能依然在阻塞......

package main

import "fmt"
import "time"

func main() {
    var ch chan int
    ch = make(chan int, 10)
    ch2 := make(chan int, 10)
    go func() {
        var i int
        for {
            ch <- i
            time.Sleep(time.Second)
            ch2 <- i * i
            time.Sleep(time.Second)
            i++
        }
    }()
    for {
        select {
        //這個case如果不能從ch中獲取數據,則會立即走下一個
        case v := <-ch:
            fmt.Println(v)
            //這個case如果不能從ch2中獲取數據,則會立即走下一個
        case v := <-ch2:
            fmt.Println(v)
        case <-time.After(time.Second):
            fmt.Println("get data timeout")
            time.Sleep(time.Second)
        default:
            fmt.Println("===================")
            time.Sleep(time.Second)
        }
    }
}

goroutine/channel(select、定時器)