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)
}

  =======



原文地址:https://www.cnblogs.com/finnlee/p/14113975.html