定期刷新 golang 中的通道

2024-01-07

我需要定期刷新频道的内容。 我用 len() 做到了这一点,我想知道是否有更好的方法来做到这一点。

http://play.golang.org/p/YzaI_2c_-F http://play.golang.org/p/YzaI_2c_-F

package main

import (
    "fmt"
    "math/rand"
    "time"
)

func main() {
    commch := make(chan int, 100)
    go fillchan(commch)
    drainchan(commch)
}

func fillchan(commch chan int) {
    for {
        select {
        case <-time.Tick(30 * time.Millisecond):
            commch <- rand.Int()
        }
    }
}

func drainchan(commch chan int) {
    for {
        chanlen := len(commch) // get number of entries in channel
        time.Sleep(1 * time.Second)
        for i := 0; i <= chanlen; i++ { //flush them based on chanlen
            fmt.Printf("chan len: %s num: %s\n", chanlen, <-commch)
        }
    }
}

EDIT 1:似乎这是更好的方法http://play.golang.org/p/4Kp8VwO4yl http://play.golang.org/p/4Kp8VwO4yl

package main

import (
    "fmt"
    "math/rand"
    "time"
)

func main() {
    commch := make(chan int, 1000)
    go fillchan(commch)
    for {
        select {
        case <-time.Tick(1000 * time.Millisecond):
            drainchan(commch)
        }
    }
}

func fillchan(commch chan int) {
    for {
        select {
        case <-time.Tick(300 * time.Millisecond):
            commch <- rand.Int()
        }
    }
}

func drainchan(commch chan int) {
    for {
        select {
        case e := <-commch:
            fmt.Printf("%s\n",e)
        default:
            return
        }
    }
}

EDIT 2:删除选择,防止内存泄漏随着时间的推移。勾选http://play.golang.org/p/WybAhRE3u4 http://play.golang.org/p/WybAhRE3u4

package main

import (
    "fmt"
    "math/rand"
    "time"
)

func main() {
    commch := make(chan int, 1000)
    go fillchan(commch)
    for _ = range time.Tick(1000 * time.Millisecond) {
        drainchan(commch)
    }
}

func fillchan(commch chan int) {
    for _ = range time.Tick(300 * time.Millisecond) {
        commch <- rand.Int()
    }
}

func drainchan(commch chan int) {
    for {
        select {
        case e := <-commch:
            fmt.Printf("%s\n", e)
        default:
            return
        }
    }
}

需要清除通道内容的情况并不常见。通道不提供此功能 - 但您可以创建一个以这种方式运行的 goroutine(...如果您really确实想要)。

通常,您会更多地考虑在一个通道上输入并在另一个通道上输出的 Goroutine;两个通道携带相同的数据类型。原则上,您可以通过这种方式对所有缓冲通道进行建模;对于它的客户端来说,goroutine 的行为就像一个普通的缓冲通道,因为它传递它接收到的内容。

将第三个通道添加到 goroutine 中,并结合select它和输入之间。这将允许您触发缓冲区的清空,而不会出现竞争条件。很简单。

现在有三个通道连接到 goroutine - 两个输入和一个输出。因此,当您设计将使用它的东西时,您可以推断刷新该数据的语义是什么。

我的脑海中浮现出一位亲戚。考虑一个具有一个输入和一个输出通道的 goroutine。它提供了一个固定大小的重写缓冲区,即即使输出通道被阻塞,也始终准备好从其输入通道读取。这还需要一个select使用默认情况,但不需要第三个通道。覆盖缓冲区有一个明确的用例:当通道和 goroutine 连接到循环中时,很可能会发生死锁。覆盖缓冲区作为死锁的一种候选解决方案很方便,因为某些数据在迟到时就没用了 - 例如,当应用程序太忙而无法响应鼠标事件时,您可以在 GUI 中丢弃这些事件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

定期刷新 golang 中的通道 的相关文章

随机推荐

  • Powershell 选择 HTML 文本

    我有以下 powershell 脚本来打开多台计算机上的多个 HTML 文件以提取许可信息 寻找一些帮助提取内部文本元素 td where id 2 寻找提取 产品 序列号 产品密钥 请求代码 ForEach system in Get C
  • 创建一个事件接收器来记录列表中用户所做的更改

    我正在开发一个 SharePoint 发布网站 我想在 SharePoint 列表中 记录 用户所做的所有更改 网上的一些搜索引导我找到了 EventReceiver 但我的 EventReceiver 必须是通用的并附加到网站集中的所有列
  • 模块构建失败:错误:TypeScript 编译中缺少 index.ts

    项目描述 我的项目是通过package json下载到node module 包 json dependencies myllc application core git ssh email protected cdn cgi l emai
  • 通过文本别名引用 Javascript 变量

    是否可以通过文本别名引用 JavaScript 变量 例如 var x 2 var y convertToVariableRef x 调用上述函数后 y将是相同的参考x而不仅仅是简单地复制值x into y 如果你声明一个没有任何函数作用域
  • Hakyll 网站的根源是什么?

    我看到创建函数需要一个标识符列表 ghci gt t create create Identifier gt Rules gt Rules 我应该使用什么标识符列表来匹配网站的根目录 例如 我只想制作一个出现在 www example co
  • GPS信号强度计算

    我想使用 NET CF 显示 GPS 设备的信号栏 我能够读取 NMEA 数据并获取 SNR 信号 但它们是许多卫星 有些处于活动状态 有些处于不活动状态 信噪比各不相同 我考虑过获取总 SNR 的平均值 但它不会给出准确的值 因为三颗强信
  • 编辑摊牌:在句子末尾保留换行符

    编辑非所见即所得 LaTeX HTML 等 散文时 您可能希望在句子末尾添加换行符 这有几个优点 更容易重新排列句子 更容易注释句子 更容易发现连续 过长的句子 评论更方便on句子 例如 The following isn t strict
  • 是否可以在 Selenium 中捕获 POST 数据?

    我正在与Selenium http seleniumhq comWebDriver 工具 我想知道该工具是否提供了一种捕获提交表单时生成的 POST 数据的方法 我正在使用 django 测试框架来测试我的数据是否在后端正确处理 我想使用
  • 这是什么 ANT 版本?

    我是 java Eclipse 的新手 我安装了 eclipse 并使用它作为 IDE 来处理 JAVA 1 4 文件 我更改了代码并保存了它并想要运行 cntr F11 或调试 F11 每次我得到 select what to run A
  • WTForms:FormField 的 FieldList 无法加载嵌套数据

    我在 FieldList 内的 FormField 内有一个自定义字段 地点 class LocationForm Form id HiddenField id title StringField l Title Required loca
  • 加载特定 MIME 类型的本机客户端 Chrome 扩展

    我为 Google Chrome Web 浏览器创建了一个本机客户端应用程序 用于播放特殊类型的音频文件 伟大的 此时该部分效果很好 我已准备好进入下一阶段 与世界分享这个应用程序 我需要这部分的帮助 根据我的理解 分发此应用程序的最佳方法
  • 如何预加载 angular2 视图,以便在首次加载时不会闪烁白页?

    我正在用纯 JS 构建一个 Angular 2 应用程序 我的问题是 当我从一个页面更改到另一个页面时 它会闪烁白色页面 直到呈现新视图 仅当我第一次访问所有组件时 才会发生这种情况 如果我第二次转到相同的路线 则页面加载时不会出现白页 我
  • 如何调整分面 tmap 图中的分面行标签高度?

    我正在使用带有行和列的 tmap 包绘制多面地图 我无法调整行的分面标签的高度 这会导致分面标签在大于特定大小或旋转时被裁剪 我已经尝试调整所有tm layout 小组的论据包括panel label height panel label
  • Ansible 循环相关问题

    我有一个剧本 其中有多个角色和串行设置 因此它首先在一台机器上运行 然后在其余机器上运行 在其中一个角色中 我有以下任务 name getting dbnodes IP addresses local action shell echo f
  • WPF 组合框样式

    下面是我的 ComboBox 样式代码 想法是在 ComboBox 周围放置边框并重用该样式
  • 我无法运行 hello.py 并获取 SyntaxError: invalid syntax

    我对 Python 和整个编程都很陌生 很抱歉问了一个看似重复的问题 但是 我无法使用以下格式运行我自己的代码 C Users Archangel gt python hello py 这是 hello py 包含的内容 Define a
  • 递归或循环[重复]

    这个问题在这里已经有答案了 我有这个方法可以计算一些统计数据 public void calculateAverage int hour if hour 20 int data 0 int times 0 for CallQueue cq
  • “+”(加号)CSS 选择器是什么意思?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 例如 p p Some declarations 我不知道是什么 方法 这和仅仅定义样式
  • HTTPS 从根域(即 apex 或“naked”)重定向到“www”子域,而浏览器不会抛出异常?

    DNS A 记录要求将 IP 地址硬编码到应用程序的 DNS 配置中 哪个Heroku 建议避免 https devcenter heroku com articles apex domains Heroku 建议两种解决方法 使用在顶端支
  • 定期刷新 golang 中的通道

    我需要定期刷新频道的内容 我用 len 做到了这一点 我想知道是否有更好的方法来做到这一点 http play golang org p YzaI 2c F http play golang org p YzaI 2c F package