美文网首页
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并发:无阻塞通道读写

    阻塞场景无论是有缓存通道、无缓冲通道都存在阻塞的情况。无缓冲通道的特点是,发送的数据需要被读取后,发送才会完成,它...

  • Golang通道的无阻塞读写

    无论是无缓冲通道,还是有缓冲通道,都存在阻塞的情况,但其实有些情况,我们并不想读数据或者写数据阻塞在那里,有1个唯...

  • channel详解

    无缓冲通道 只有当读写都准备好时才不会被阻塞 输出: 有缓冲通道 当有缓冲通道长度未满时,写入是无阻塞的 输出: ...

  • Go sync.Map

    map并发读线程安全,并发读写线程不安全。 sync.Map 读写分离 空间换时间 Map Golang1.6之前...

  • Golang通道的无阻塞读写的方法示例

    无论是无缓冲通道,还是有缓冲通道,都存在阻塞的情况,但其实有些情况,我们并不想读数据或者写数据阻塞在那里,有1个唯...

  • Golang并发操作变量需要注意的问题

    思考源于这个问题: golang 中并发读写同一个变量会出现部分错乱吗? 要记得golang中变量的赋值不是并发安...

  • chan通道无阻塞读写

    通过time超时机制实现 使用如下:

  • golang 中 channel 的非阻塞访问方法

    在golang中,基本的channel读写操作都是阻塞的,如果你想要非阻塞的,可以使用如下示例: 即只要在sele...

  • golang 不同类型的nil值

    golang 不同类型的nil值 nil通道 通道必须使用make函数进行初始化,对nil管道进行读写会导致永久阻...

  • Golang使用redis阻塞读brpop实现即时响应并发执行

    实现 主要利用redis的brpop阻塞读和Golang的goroutine并发控制以及os/exec执行程序,实...

网友评论

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

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