unlimited channel buffer in Go
2024-10-15 02:30:21
channel buffer可以事先分配大小,但是这些是需要占用内存的,事先分配几G内存给一个channel很浪费资源的,所以怎样创建一个无限的channel buffer呢?比较naive的写法就是把东西放进一个队列里,然后时刻检查队列的大小,比如说:
for {
if len(queue) != 0 {
data = queue.front()
out <- data
} else {
time.sleep(time.Duration(1) * time.Microsecond)
}
}
但是这样写是有问题的,就是当queue的中新加了元素时,并不能及时的检查出来,对性能损害极大。问题的关键在于如何在加入queue时通知out呢?如果直接通知out是会在out处阻塞的。正确写法如下:
for {
if len(queue) != 0 {
data := queue.front()
select {
case out <- data:
queue.pop()
case job = <- in:
queue.push(job)
} else {
queue.push(<- in)
}
select可以同时等待多个channel,所以当有数据进来或者出去时,都可以触发相应的操作。
最新文章
- 微信Api分享
- Lambda表达式入门
- 情感分析的现代方法(包含word2vec Doc2Vec)
- ZOJ3791_An Easy Game
- 拼接sql是陷阱
- Jetson TK1刷机+配置Mini PCI-e无线网卡
- 40个最好的Tumblr主题
- fastJson泛型如何转换
- 【FOI】异或问题
- php,cgi,nginx关系
- 【BZOJ4071】八邻旁之桥(线段树)
- javascript对象序列化(对象与JSON字符串的互换)
- 解决Pycharm更新package出现的问题:AttributeError:module &#39;pip&#39; has no attribute &#39;main&#39;
- 因缺失log4j.properties 配置文件导致flume无法正常启动。
- 【Spider】学习使用XMLFeedSpider
- 误删centos的ps命令,恢复
- Java虚拟机笔记(五):JVM中对象的分代
- Nexus Repository 搭建及使用
- python打印图形大全(详解)
- &#39;not all arguments converted during string formatting&#39;错误告警信息解决办法
热门文章
- ElementTree 解析xml(minidom解析xml大文件时,MemoryError)
- for循环计算阶乘的和,for循环计算阶乘倒数的和
- Cannot resolve class or package &#39;dbcp&#39; Cannot resolve class &#39;BasicDataSource&#39;
- Python issubclass() 函数
- 根据二进制和十进制转换规则转换成游戏[xyytit]
- Swift 项目中可能用到的第三方框架
- maven项目工程目录约定
- mysql 版本bug
- illumina SBS测序详解
- easyui-tabs及其内容展示