美文网首页
24.Go语言·协程Goroutine

24.Go语言·协程Goroutine

作者: 一枼落知天下 | 来源:发表于2019-06-11 19:24 被阅读0次

    main.go

    // Go语言·协程Goroutine·管道Channel
    package main
    
    
    import (
        model "day30/model"
    )
    
    var content string = `
    ————————————————Go语言·协程Goroutine·管道Channel————————————————————
    一、进程和线程
        1.进程是程序在操作系统中的一次执行过程。是系统进行
        资源分配和调度的基本单位
        2.线程是进程的一个执行实例,是程序执行的最小单元,
        它是比进程更小的能独立运行的基本单位
        3.一个进程可以创建和销毁多个线程,同时一个进程中的
        多个线程可以并发执行。
        4.一个程序至少有一个进程,一个进程至少有一个线程。
    二、并发和并行
        1.多线程程序在单核上运行,就是并发
            .多个任务作用在一个CPU上
            .从微观的角度看,在某一个时间点,其实只有一个任务在执行
            .进行轮询操作。
        2.多个线程程序多核上运行,就是并行
            .多个任务作用在多个CPU上
            .每个线程都在各自不同的CPU上执行
            .从微观的角度看,在某一个时间点,多个线程同时在执行
    三、Go协程和Go主线程
        1.Go主线程(简称:线程、也可以理解为进程):一个Go线程上,可以
        起多个协程,协程是轻量级的线程[编译器做咯优化]
        2.Go协程的特点:
            a.有独立的栈空间
            b.共享程序堆空间
            c.调度由用户控制
            d.协程是轻量级的线程
    四、小结
        1.主线程是一个物理线程,直接作用在CPU上的,是重量级的,非常耗费CPU
        资源。
        2.协程是主线程开启的,是轻量级的,是逻辑态,对资源消耗相对小。
        3.Golang的协程 :可以轻松开启上万个协程。
        其他编程语言的并发机制:一般基于线程的,开启过多的线程,资源消耗大,
    五、MPG模式
        M:操作系统的主线程(是物理线程)
        P:协程执行需要的上下文
        G:协程
    六、Cpu
        // 获取CPU
        cpuNum := runtime.NumCPU()
        fmt.Println(cpuNum)
    
        // 设置使用多个CPU
        // 1.8后,默认程序运行在多个核心上,不用设置咯。
        runtime.GOMAXPROCS(cpuNum-1)
        fmt.Println("ok")
    `
    
    
    
    
    func main() {
        model.Entry()
    }
    

    Utils.go

    package model
    
    import (
        "fmt"
        "strconv"
        "time"
        "runtime"
    )
    
    /**
     * [Init 入口]
     * @author Jhou Shuai
     * @datetime 2019-05-18T11:58:33+0800
     */
    func Entry() {
        
    }
    
    func cpuInfo() {
        // 获取CPU
        cpuNum := runtime.NumCPU()
        fmt.Println(cpuNum)
    
        // 设置使用多个CPU
        // 1.8后,默认程序运行在多个核心上,不用设置咯。
        runtime.GOMAXPROCS(cpuNum-1)
    
        fmt.Println("ok")
    }
    
    
    func going() {
    
        go test()
    
        for i := 0; i <10; i++ {
            fmt.Println("[main]Hello MyGboy !"+strconv.Itoa(i))
            time.Sleep(time.Second)
        }
    }
    
    // 开启一个协程
    func test() {
        for i := 0; i <10; i++ {
            fmt.Println("[Test]Hello world !"+strconv.Itoa(i))
            time.Sleep(time.Second)
        }
    }
    

    相关文章

      网友评论

          本文标题:24.Go语言·协程Goroutine

          本文链接:https://www.haomeiwen.com/subject/cojcfctx.html