zoukankan      html  css  js  c++  java
  • 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)
    }
    

      =======



  • 相关阅读:
    2013面试C++小结
    Linux C 面试题总结 .
    [SCOI2011]糖果
    python——简单爬虫
    python——ADSL拨号程序
    python——处理xls表格
    Vsphere初试——架设Panabit行为管理
    Vsphere初试——使用Vsphere client
    Vsphere初试——基本安装
    Python2与Python3的不同点
  • 原文地址:https://www.cnblogs.com/finnlee/p/14113975.html
Copyright © 2011-2022 走看看