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

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

  •  
  •   sunshinev · 2020-11-20 12:19:33 +08:00 · 1123 次点击
    这是一个创建于 1489 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如

    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  
       2020-11-20 12:30:07 +08:00
    蹲一个回答,盲猜应该是爆内存为止
    loading
        2
    loading  
       2020-11-20 12:34:51 +08:00 via Android
    写一段测试一下就好了,二分法学过吧,你用二次幂不就行了。
    CEBBCAT
        3
    CEBBCAT  
       2020-11-20 17:46:45 +08:00
    读过源码之后我简单总结一下( go1.14.4 darwin x86_64 ):

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

    还是看代码吧:

    https://gist.github.com/Zhang-Siyang/364b512192275fa9d04978353b5d4443

    出自: https://github.com/golang/go/blob/go1.14.4/src/runtime/chan.go#L71-L111
    CEBBCAT
        4
    CEBBCAT  
       2020-11-27 10:36:23 +08:00
    楼主怎么不回帖啊,你这样子以后还有谁愿意解答你的问题
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3027 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 14:04 · PVG 22:04 · LAX 06:04 · JFK 09:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.