关于channel要make多大的问题

例如,我有一个channel,然后go了一万个协程。所有的协程都会往这个channel里面回传一些东西回来,那么,我make这个channel的时候就要make一万个长度么? 这样的话,我觉得,是不是很浪费内存啊,因为这个长度并没有被有效的里用啊?

我有一个想法是,channel看做一个队列,如果满了,其他的协程就稍微等等再往里面放呗。

这样的思路是不是有问题呢?还是说,是不是有什么使用的技巧,是我不知道的呢?我现在是一万个协程的话,就make了一万长度的channel啊

共 6 个回复


16779242

首先你的channel是有进有出的。你有go-routine往里面写东西,自然就有routine将里面的东西取出,否则只进不出,这个channel也没什么意义。

channel里的东西一旦取出,就会空出空间。channel的进出只要达到一个动态的平衡就好。至于channel的缓冲区大小,不能一概而论,要看具体项目要求的。

# 0

suilongfei

我也是这么理解的,我的channel当然是有进有出啊,只是每次都是,如果make的比协程的数量少了,就会报错。不知道一楼的朋友能给一个样例么?

# 1

stevewang

很可能你实际上不需要10K长度的channel,如果看上去需要,实际上可能是你的消费者的速度太慢导致。你应该增加消费者的速度或数量;或者减少生产者的速度或数量。应该从这方面去想解决方法。

# 2

suilongfei

嗯嗯,谢谢三楼的哥们

# 3

limickey

实际上肯定不需要那么多,如果这个channel 对性能影响比较大,

可以考虑,用可用cpu 数目的(最少一半,最多和cpu数目一样)作为缓存,

代表一部分有cpu往channel 写,一部分cpu读channel。

即使再多缓存,也会停在channel里面,没有空余的CPU去读也没用。

# 4

David

"如果make的比协程的数量少了,就会报错"是什么错?

# 5