美文网首页
Golang并发:无阻塞通道读写

Golang并发:无阻塞通道读写

作者: bocsoft | 来源:发表于2018-12-29 14:23 被阅读0次

    阻塞场景
    无论是有缓存通道、无缓冲通道都存在阻塞的情况。
    无缓冲通道的特点是,发送的数据需要被读取后,发送才会完成,它阻塞场景:
    1)通道中无数据,但执行读通道。
    2)通道中无数据,向通道写数据,但无协程读取。

    有缓存通道的特点是,有缓存时可以向通道中写入数据后直接返回,缓存中有数据时可以从通道中读到数据直接返回,这时有缓存通道是不会阻塞的,它阻塞场景是:

    1)通道的缓存无数据,但执行读通道。
    2)通道的缓存已经占满,向通道写数据,但无协程读。

    使用default实现的无阻塞通道阻塞有一个缺陷:当通道不可读或写的时候,会即可返回。实际场景,更多的需求是,我们希望尝试读一会数据,或者尝试写一会数据,如果实在没法读写再返回,程序继续做其它的事情。

    使用定时器替代default可以解决这个问题,给通道增加读写数据的容忍时间。

    func ReadWithSelectTimeout(ch chan int) (x int, err error) {
        timeout := time.NewTimer(time.Microsecond * 500)
    
        select {
        case x = <-ch:
            return x, nil
        case <-timeout.C:
            return 0, errors.New("read time out")
        }
    }
    
    func WriteChWithSelectTimeout(ch chan int) error {
        timeout := time.NewTimer(time.Microsecond * 500)
    
        select {
        case ch <- 1:
            return nil
        case <-timeout.C:
            return errors.New("write time out")
        }
    }
    
    
    
    

    相关文章

      网友评论

          本文标题:Golang并发:无阻塞通道读写

          本文链接:https://www.haomeiwen.com/subject/kunulqtx.html