天天看點

golang 走起(六) 逾時golang 走起(六) 逾時

golang 走起(六) 逾時

代碼:

package main

import (
    "log"
    "time"
)

func main() {
    ch := make(chan int,)
    to := make(chan bool)

    defer func() {
        close(ch)
        close(to)
        log.Println("h")
    }()

    go func() {
        time.Sleep(time.Second)
        to <- true
    }()

    go func() {
        m := <- ch
        log.Println("recv ok, m:", m)
        time.Sleep(time.Second *)
    }()

    for i :=; i <; i++ {
        log.Println("send i:", i)
        select {
        case ch <- i:
            log.Println("send ok i:", i)
        case <- to:
            log.Println("timeout, i:", i)
            return
//        default:
//            log.Println("send failed i:", i)
        }
    }
}
           

結果:

2016/03/04 15:02:48 send i: 0

2016/03/04 15:02:48 send ok i: 0

2016/03/04 15:02:48 send i: 1

2016/03/04 15:02:48 send ok i: 1

2016/03/04 15:02:48 send i: 2

2016/03/04 15:02:48 recv ok, m: 0

2016/03/04 15:02:48 send ok i: 2

2016/03/04 15:02:48 send i: 3

2016/03/04 15:02:49 timeout, i: 3

2016/03/04 15:02:49 h

代碼中ch是2個int的chan,發送多個時如果不擷取的話就會卡主,直到擷取到為止,我們需要一個逾時的機制保證不會卡死。

除了逾時還有其他的辦法嗎?

有,就是default使用,但是它是有弊端的,這裡我們把default注釋打開

結果:

2016/03/04 15:08:14 send i: 0

2016/03/04 15:08:14 send ok i: 0

2016/03/04 15:08:14 send i: 1

2016/03/04 15:08:14 send ok i: 1

2016/03/04 15:08:14 send i: 2

2016/03/04 15:08:14 send failed i: 2

2016/03/04 15:08:14 send i: 3

2016/03/04 15:08:14 send failed i: 3

2016/03/04 15:08:14 send i: 4

2016/03/04 15:08:14 send failed i: 4

2016/03/04 15:08:14 send i: 5

2016/03/04 15:08:14 send failed i: 5

2016/03/04 15:08:14 send i: 6

2016/03/04 15:08:14 send failed i: 6

2016/03/04 15:08:14 send i: 7

2016/03/04 15:08:14 send failed i: 7

2016/03/04 15:08:14 send i: 8

2016/03/04 15:08:14 send failed i: 8

2016/03/04 15:08:14 send i: 9

2016/03/04 15:08:14 send failed i: 9

2016/03/04 15:08:14 h

可以看出從第三個開始就failed,也就是走default語句了,而不會出現卡死的情況,但是後邊沒有放進去的資料就會被丢棄了

是以如何去把控使用,需要自己斟酌