GO精髓(goroutine)
进程和线程 进程: 程序在操作系统中的一次执行过程,是系统进行资源分配和调度的基本单位,每一个进程都有自己的一块地址空间 线程: 线程是进程的一个执行实例 一个进程可以创建多个线程 同一个进程中的多个线程可以并发执行 并发和并行(针对多线程) 并发: 多个线程同时竞争一个位置,竞争到的才可以执行,每一个时间段只有一个线程在执行 并行:多个线程可以同时执行,每一个时间段可以有多个线程执行 多线程程序在单核的CPU上运行就是并发,多线程程序在多核的CPU上运行就是并行,如果进程数大于CPU核数,则多线程程序在多个CPU上面运行即有并发又有并行
var wg sync.WaitGroup //主线程等待协程执行结束后才终止程序 func test(){ for i := 0;i < 10 ; i++ { time.Sleep(time.Millisecond * 100) fmt.Println("test()你好-",i) } wg.Done() //协程执行完后 协程计数器减1 } func main() { wg.Add(1) //协程执行开始 协程计数器加1 go test() //开启一个协程 让test和main两个线程并行执行 (BUG:如果主线程执行速度比协程快 主线程执行结束 就会终止程序) for i := 0;i < 10 ; i++ { time.Sleep(time.Millisecond * 20) fmt.Println("main()你好-",i) } wg.Wait() //会等待所有协程执行完毕才会退出 fmt.Println("主线程退出") }
//获取CPU个数
cpuNum := runtime.NumCPU()
fmt.Println("CPU数量:",cpuNum)
//设置使用多个CPU
runtime.GOMAXPROCS(cpuNum-1)
var wg sync.WaitGroup func test(n int){ for num := (n-1)*30000+1;num < n*30000 ;num++ { var flag = true for i := 2;i < num ; i++ { if(num % i == 0 ){ flag = false break } } if flag{ fmt.Println(num,"是素数","所属协程:",n) } } wg.Done() } func main() { //开始时间戳 stimeUnix := time.Now().Unix() for i := 1;i <= 4 ;i++ { wg.Add(1) go test(i) } wg.Wait() //结束时间戳 etimeUnix := time.Now().Unix() diffTime := etimeUnix - stimeUnix fmt.Println("执行完毕") fmt.Println(diffTime) }
=======