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