zoukankan      html  css  js  c++  java
  • go chan 缓存与阻塞

    原文链接:Go语言第十一课 并发(三)Channel缓存与阻塞

    Channel的缓存

    前面介绍过channel的创建方法:

    channel_test := make(chan string)

    其实它完整的写法应该是:

    channel_test := make(chan string,0)

    这种容量为0的channel就是无缓存channel。对应地,我们也可以创建有缓存channel

    channel_test := make(chan string,1)

    无缓存channel

    channel是否有缓存最根本的不同是阻塞策略的不同。

    无缓存的channel会在读写两端产生阻塞即:

    当对一个无缓存的channel读时,若数据尚未到达,则读协程阻塞;当对一个无缓存的channel写时,若数据尚未消费,则写协程阻塞。

    基于此,无缓存的channel也成为同步channel

    需要特别注意的是,当数据尚未被消费时,接收者接收数据发生在唤醒发送者协程之前!

    有缓存channel

    带缓存的channel实际上是一个阻塞队列。对队列的写总发生在队尾,队列满时写协程阻塞;对队列的读总发生在队尾,队列空时读协程阻塞。

    内置函数cap(channel)可以读取队列的总长度。

    内置队列len(channel)可以读取队列的有效长度(已使用长度)。

    有缓存的channel的最大意义在于生产和消费可以解耦。

    协程泄漏

    协程永远阻塞,无法退出。即协程泄漏。协程的泄漏无法被自动回收,所以要极力避免!要确保每个协程都可以正常退出。

  • 相关阅读:
    WPF多路绑定
    ConfigurationManager
    开发小技巧1——Logger
    C#对json数据的解析
    Process类
    JS获取访客IP+判断归属地+自动跳转
    织梦默认编辑器换成kindEditor实操教程
    linux中添加环境变量(python为例)
    原生javascript实现省市区三级联动
    kali安装火狐浏览器
  • 原文地址:https://www.cnblogs.com/wangjq19920210/p/11527106.html
Copyright © 2011-2022 走看看