原文链接: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的最大意义在于生产和消费可以解耦。

协程泄漏

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

最新文章

  1. 2Struts2配置----青软S2SH(笔记)
  2. UWP webview 键盘bug,回退页面,键盘会弹一下。
  3. Hibernate使用
  4. 在ubuntu16编译安装nginx-1.10.2(full)完全自带组件
  5. FlashFXP命令行
  6. BIO,NIO,AIO的理解
  7. ARM开发板挂载U盘
  8. FPGA初学心得
  9. 【HDU 5456】 Matches Puzzle Game (数位DP)
  10. javascript 和 jquery 语法上的一些区别
  11. [Falcor] Retrieving Multiple Values
  12. 13、Cocos2dx 3.0三,找一个小游戏开发3.0中间Director :郝梦主,一统江湖
  13. Codeforces Round #366 (Div. 2)_B. Spider Man
  14. CNPM 遇到use strict的问题
  15. .babelrc和babel.config.js的相同配置不能合并
  16. js 基本
  17. Redis入门很简单之六【Jedis常见操作】
  18. Good Bye 2017(送命场)
  19. vue2.0的常用功能简介
  20. Struts2框架action路径问题心得----》页面url请求怎么找action

热门文章

  1. js控制语句练习(回顾)
  2. ken桑带你读源码 之scrapy scrapy\core\scheduler.py
  3. c++ 第一天 变量、判断、循环
  4. PHP array_reverse() 函数
  5. C/C++编程笔记:C语言进制详解,二进制、八进制和十六进制!
  6. 4.9 省选模拟赛 圆圈游戏 树形dp set优化建图
  7. ElasticSearch 基本概念 and 索引操作 and 文档操作 and 批量操作 and 结构化查询 and 过滤查询
  8. Struts2中Get请求转码问题
  9. 【BZOJ1426】收集邮票 题解 (期望)
  10. Docker初探之Windows篇