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

2020-11-20 12:19:33 +08:00
 sunshinev

比如

ch := make(chan int32,1)

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

// 如果继续 ch <- 3

ch <- 4

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

1132 次点击
所在节点    问与答
4 条回复
BoarBoar
2020-11-20 12:30:07 +08:00
蹲一个回答,盲猜应该是爆内存为止
loading
2020-11-20 12:34:51 +08:00
写一段测试一下就好了,二分法学过吧,你用二次幂不就行了。
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
2020-11-27 10:36:23 +08:00
楼主怎么不回帖啊,你这样子以后还有谁愿意解答你的问题

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

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

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

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

© 2021 V2EX