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,所以当有数据进来或者出去时,都可以触发相应的操作。

最新文章

  1. 微信Api分享
  2. Lambda表达式入门
  3. 情感分析的现代方法(包含word2vec Doc2Vec)
  4. ZOJ3791_An Easy Game
  5. 拼接sql是陷阱
  6. Jetson TK1刷机+配置Mini PCI-e无线网卡
  7. 40个最好的Tumblr主题
  8. fastJson泛型如何转换
  9. 【FOI】异或问题
  10. php,cgi,nginx关系
  11. 【BZOJ4071】八邻旁之桥(线段树)
  12. javascript对象序列化(对象与JSON字符串的互换)
  13. 解决Pycharm更新package出现的问题:AttributeError:module &#39;pip&#39; has no attribute &#39;main&#39;
  14. 因缺失log4j.properties 配置文件导致flume无法正常启动。
  15. 【Spider】学习使用XMLFeedSpider
  16. 误删centos的ps命令,恢复
  17. Java虚拟机笔记(五):JVM中对象的分代
  18. Nexus Repository 搭建及使用
  19. python打印图形大全(详解)
  20. &#39;not all arguments converted during string formatting&#39;错误告警信息解决办法

热门文章

  1. ElementTree 解析xml(minidom解析xml大文件时,MemoryError)
  2. for循环计算阶乘的和,for循环计算阶乘倒数的和
  3. Cannot resolve class or package &#39;dbcp&#39; Cannot resolve class &#39;BasicDataSource&#39;
  4. Python issubclass() 函数
  5. 根据二进制和十进制转换规则转换成游戏[xyytit]
  6. Swift 项目中可能用到的第三方框架
  7. maven项目工程目录约定
  8. mysql 版本bug
  9. illumina SBS测序详解
  10. easyui-tabs及其内容展示