基本上标题是什么。我想知道对通道大小有很大限制的缺点是什么
k := make(chan int, 100000000)
答案 0 :(得分:6)
它将分配大量内存。在makechan
实现中,我们可以看到它在您创建通道时完全分配了发送缓冲区:
http://code.google.com/p/go/source/browse/src/pkg/runtime/chan.goc#40
因此,对于您的具体示例,您将预先分配至少400MB(在32位系统上)或800MB(在64位系统上)的内存。
如果您发现自己需要超大型缓冲区,那么其他一些数据结构是否可能更适合您的需求?
答案 1 :(得分:4)
如果你真的需要一个大排队,但不是所有时间,那么如何让你自己成长/缩小?
func makeQueue() (enqueue chan<- int, dequeue <-chan int) {
enq, deq := make(chan int), make(chan int)
var queue []int
go func() {
for {
if len(queue) == 0 {
queue = append(queue, <-enq)
}
select {
case v := <-enq:
queue = append(queue, v)
case deq <- queue[0]:
queue = append([]int{}, queue[1:]...)
}
}
}()
return enq, deq
}
http://play.golang.org/p/q_Uw-E9NQb
警告:实施后,出列操作会复制整个底层切片。尽管在Go中复制是惯用的,但是分析可能会显示链接列表(如http://godoc.org/container/list)可能更快。您还可以安排从较大的块中提取队列,并从这些块中取出读取,从而减少复制操作。
答案 2 :(得分:2)
您也可以从渠道套餐中收集一些想法:https://github.com/eapache/channels
它支持在不使用多余空间的情况下增长的频道。它还具有批处理功能,听起来可能对您的目的有用。