ItemSaver中的itemCount的问题
来源:17-1 ItemSaver的架构

sd1700092
2018-04-12
go func() {
itemCount := 0
for {
item := <-out
log.Printf("Item saver got item #%d: %v", itemCount, item)
itemCount++
}
}()
老师,我留意到itemCount是在go func()里面的。我觉得每一个go func()不都是一个协程么,那么itemCount应该是每一个协程的局部变量吧?应该有多少个协程就有多少个互相独立的itemCount分别统计item的个数。
可是我实际跑一下发现不是这样,itemCount是全局的,也就是所有协程都用的是同一个itemCount。
请问这是为啥,为什么我自己的想法和实际不符?
写回答
1回答
-
ccmouse
2018-04-13
这个itemCount的确是每一个go func()自己的局部变量,他们互相是独立的。但是我只开了一个ItemSaver呀:)虽然worker有很多个,但ItemSaver只有一个。
那么这个问题很好,如果我们一个ItemSaver不够,要开很多个,如何来计数?
当然不能直接开很多个,因为itemCount是互相独立的。比较传统的做法是放一个全局的itemCount变量,然后通过锁来保护,并且增加计数。
go语言的话我们有更自然的解决方法。我们先让所有的item过全局仅有一个的ItemCounter goroutine,里面就像现在这样用局部变量进行计数,然后再分发给各个ItemSaver进行处理,这样就好了。
30
相似问题