go 的 select 方法很适合 cache 啊

2017-12-24 09:41:35 +08:00
 jpmorn

在这里看到的。https://mzh.io/%E4%B8%80%E4%BA%9BGolang%E5%B0%8F%E6%8A%80%E5%B7%A7

在 nsq 中,需要读取之前磁盘上的,或者是从内存中直接读取,一般人都是先判断内存中有没有数据,然而,nsq 另辟蹊径使用了 select 语句,把 CSP 模式用到了极致。

select {
        case msg = <-c.memoryMsgChan:  //尝试从内存中读取
        case buf = <-c.backend.ReadChan(): //如果内存中没有,直接从磁盘上读取
            msg, err = decodeMessage(buf)
            if err != nil {
                c.ctx.nsqd.logf("ERROR: failed to decode message - %s", err)
                continue
            }

这个想法蛮好啊。

3296 次点击
所在节点    Go 编程语言
25 条回复
stabc
2017-12-24 18:18:32 +08:00
@twm 这个域名不做 CSGO 社区可以了……
dumplinger
2017-12-25 09:39:59 +08:00
select 的一个神坑就是多个 case 之间是无序的,当都有数值的时候会随机的返回其中一个 case,巨恶心。
zhqy
2017-12-25 11:03:07 +08:00
代码逻辑没问题,建议看完整的代码。你贴的代码里那段中文注释错了,这里不是 if else,是 or 的关系。select 本身是无序的。
jameshuazhou
2017-12-25 11:17:55 +08:00
说 select-case 无序是坑的,官方文档早就说明得很详细了,而且这特性可以实现一些比较有意思的功能。
敢问坑在哪里?
sorra
2017-12-25 17:47:52 +08:00
两个都是 channel,应该是谁刚好有数据就选谁。channel 不可能主动去查磁盘吧?应该要别的 goroutine 从磁盘查数据放进 channel。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/417179

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX