goroutine/channel(select、定时器)

应用场景举例:
一个任务管道满了,再往里面塞就塞不进去了,浏览器刷不出来了。用户即便关了浏览器可能依然在阻塞......

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)
        }
    }
}

猜你喜欢

转载自blog.51cto.com/5660061/2348476
今日推荐