V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
sunshinev
V2EX  ›  问与答

Go 里面的 channel 最长可以阻塞多少数据呢?

  •  
  •   sunshinev · 212 天前 · 561 次点击
    这是一个创建于 212 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如

    ch := make(chan int32,1)

    ch <- 1 ch <- 2 // 这条记录就开始阻塞了,

    // 如果继续 ch <- 3

    ch <- 4

    那么最长可以保持多长的数据队列呢?

    4 条回复    2020-11-27 10:36:23 +08:00
    BoarBoar
        1
    BoarBoar   212 天前
    蹲一个回答,盲猜应该是爆内存为止
    loading
        2
    loading   212 天前 via Android
    写一段测试一下就好了,二分法学过吧,你用二次幂不就行了。
    CEBBCAT
        3
    CEBBCAT   212 天前
    读过源码之后我简单总结一下( go1.14.4 darwin x86_64 ):

    - 元素大小不能大于 1<<16
    - size 不能超过 uint() 能接受的上限(我这里好像 uint 的跨度和 int 的跨度是一样的,都是 64 位)
    - 元素大小*chan 尺寸要能经过 runtime/internal/math 中 MulUintptr 的检查(这段逻辑有点难读,我英文一般)

    还是看代码吧:



    出自: https://github.com/golang/go/blob/go1.14.4/src/runtime/chan.go#L71-L111
    CEBBCAT
        4
    CEBBCAT   205 天前
    楼主怎么不回帖啊,你这样子以后还有谁愿意解答你的问题
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2001 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 10:52 · PVG 18:52 · LAX 03:52 · JFK 06:52
    ♥ Do have faith in what you're doing.