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

      =======



  • 相关阅读:
    ThinkPHP---thinkphp视图(V)
    PHP封装文件上传
    小数据池、深浅拷贝、集合
    字典、字典嵌套
    列表、元组、range
    字符串详解:整型、可变数据类型和不可变数据类型、进制转换、索引、切片、步长、字符串方法、进制转换
    while循环、break、格式化、运算符、编码初始
    强烈推荐一款CSS导航菜单
    解决WEB页面上"焦点控制"一法
    新闻发布项目——后台JSP界面adminManage/manageTopic.jsp
  • 原文地址:https://www.cnblogs.com/finnlee/p/14113975.html
Copyright © 2020-2023  润新知