目标
实现指定个核心最大化使用,比如核心总数减一。
代码
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 
 | package mainimport (
 "runtime"
 "sync"
 )
 var (
 cpunum = runtime.NumCPU()-1
 )
 func main(){
 ch := make(chan string)
 runtime.GOMAXPROCS(cpunum)
 wg := sync.WaitGroup{}
 
 for i := 0; i < cpunum; i++{
 go WgReadLogs(ch, &wg)
 }
 
 wg.Add(2)
 ch <- "./health/stat1.rec"
 ch <- "./report/stat2.rec"
 wg.Wait()
 close(ch)
 }
 func WgReadLogs(ch chan string,wg *sync.WaitGroup){
 for true{
 tmp,ok := <-ch
 if !ok{
 break
 }
 ReadLogs(tmp)
 wg.Done()
 }
 }
 func ReadLogs(logname string){
 fmt.Println(logname)
 }
 
 | 
解释
| 12
 3
 4
 
 | import ("runtime"
 "sync"
 )
 
 | 
必要的库。
| 12
 3
 
 | var (cpunum = runtime.NumCPU()-1
 )
 
 | 
要使用的cpu数量,建议不全使用。
| 12
 3
 
 | ch := make(chan string)runtime.GOMAXPROCS(cpunum)
 wg := sync.WaitGroup{}
 
 | 
建立管道。
声明使用的cpu数。
建立互斥关系,本例中主要为了实现所有线程执行完后再执行后续程序。
| 12
 3
 
 | for i := 0; i < cpunum; i++{go WgReadLogs(ch, &wg)
 }
 
 | 
创建cpu数减1个线程
| 12
 3
 4
 5
 
 | wg.Add(2)ch <- "./health/stat1.rec"
 ch <- "./report/stat2.rec"
 wg.Wait()
 close(ch)
 
 | 
后面每个任务结束时要done一个wg,这里根据具体情况加,是循环就在每个循环里加,保证后面能全部done即可。
没有缓冲的、阻塞式的往管道传递字符串。
Wait是等所有线程都执行完,即增加的数字被全done掉。
关闭管道。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 
 | func WgReadLogs(ch chan string,wg *sync.WaitGroup){for true{
 tmp,ok := <-ch
 if !ok{
 break
 }
 ReadLogs(tmp)
 wg.Done()
 }
 }
 
 | 
假设已有的函数是ReadLogs,在它的基础上加个Wg加函数名的新函数,我觉得这种方式不改变原有的,比较舒服。
大意是:循环从管道读取字符串,读不到了就跳出循环。
每个ReadLogs()之后加一个wg.Done(),相当于计数减一。
ReadLogs()就是要执行的任务,不再解释。
总结
就是开指定个线程。
管道阻塞传值。
wg同步。
WgReadLogs循环接收。