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进行处理,这样就好了。


3
0

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程