go chan 缓存与阻塞
2024-08-28 20:00:00
原文链接: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的最大意义在于生产和消费可以解耦。
协程泄漏
协程永远阻塞,无法退出。即协程泄漏。协程的泄漏无法被自动回收,所以要极力避免!要确保每个协程都可以正常退出。
最新文章
- 2Struts2配置----青软S2SH(笔记)
- UWP webview 键盘bug,回退页面,键盘会弹一下。
- Hibernate使用
- 在ubuntu16编译安装nginx-1.10.2(full)完全自带组件
- FlashFXP命令行
- BIO,NIO,AIO的理解
- ARM开发板挂载U盘
- FPGA初学心得
- 【HDU 5456】 Matches Puzzle Game (数位DP)
- javascript 和 jquery 语法上的一些区别
- [Falcor] Retrieving Multiple Values
- 13、Cocos2dx 3.0三,找一个小游戏开发3.0中间Director :郝梦主,一统江湖
- Codeforces Round #366 (Div. 2)_B. Spider Man
- CNPM 遇到use strict的问题
- .babelrc和babel.config.js的相同配置不能合并
- js 基本
- Redis入门很简单之六【Jedis常见操作】
- Good Bye 2017(送命场)
- vue2.0的常用功能简介
- Struts2框架action路径问题心得----》页面url请求怎么找action
热门文章
- js控制语句练习(回顾)
- ken桑带你读源码 之scrapy scrapy\core\scheduler.py
- c++ 第一天 变量、判断、循环
- PHP array_reverse() 函数
- C/C++编程笔记:C语言进制详解,二进制、八进制和十六进制!
- 4.9 省选模拟赛 圆圈游戏 树形dp set优化建图
- ElasticSearch 基本概念 and 索引操作 and 文档操作 and 批量操作 and 结构化查询 and 过滤查询
- Struts2中Get请求转码问题
- 【BZOJ1426】收集邮票 题解 (期望)
- Docker初探之Windows篇