并行是指同一时间做多件事情,并发是指同一时间具有做多件事情的能力。在很多情况下,并发的效果比并行好,因为操作系统的硬件资源和总资源是很少而且固定的,不能无限去扩张。Go 语言设计的时候应该也是推崇这种使用较少资源做更多事情的哲学。
并发执行
Go 语言中可以使用系统功能设置可以使用的物理处理器(核),如果设置为 1 的话,所有的协程会在一个核上运行。
1package main 2 3import ( 4 "fmt" 5 "runtime" 6 "sync" 7 ) 8 9var wg sync.WaitGroup 10 11func printPrime(prefix string) { 12 defer wg.Done() 13 14next: 15 for outer := 2; outer < 5000; outer++ { 16 for inner := 2; inner < outer; inner++ { 17 if outer % inner == 0 { 18 continue next 19 } 20 } 21 fmt.Printf("%s:%d\n", prefix, outer) 22 } 23 fmt.Printf("Completed", prefix) 24} 25 26func main() { 27 runtime.GOMAXPROCS(1) 28 wg.Add(2) 29 fmt.Println("Create Goroutines") 30 go printPrime("A") 31 go printPrime("B") 32 33 fmt.Println("Waiting to Finish") 34 wg.Wait() 35 36 fmt.Println("Terminating program") 37}
结果打印
1A:4513 2A:4517 3A:4519 4A:4523 5A:4547 6B:3739 7B:3761 8... 9B:4951 10B:4957 11B:4967 12B:4969 13B:4973 14B:4987 15B:4993 16B:4999 17Completed%!(EXTRA string=B)A:4549 18A:4561 19A:4567 20A:4583 21A:4591 22A:4597 23A:4603 24A:4621 25A:4637 26
也就是两个协程交替执行。
并行执行
更改 runtime.GOMAXPROCS(1) 为 runtime.GOMAXPROCS(runtime.NumCPU()) 后,会使用硬件的多核,并行执行。
结果打印
1B:4943 2A:4951 3B:4951 4A:4957 5B:4957 6A:4967 7B:4967 8A:4969 9B:4969 10A:4973 11A:4987 12B:4973 13B:4987 14A:4993 15B:4993 16A:4999