Go 协程

go协程

package main

import (
    "fmt"
    "runtime"
    "time"
)

//goroutine--->协程---2kb大小,100
//线程----》几个m
//go协程会复用线程

// goroutine之间通信,通过 信道channel 通信
//go推崇用信道通信,而不推崇用共享变量通信(锁,死锁)


//启动一个goroutine

func test()  {
    fmt.Println("go go go")
}
//func main() {
//    fmt.Println("主线程开始执行")
//    go test()
//    go test()
//    go test()
//    go test()
//    go test()
//    go test()
//    go test()
//    go test()
//    time.Sleep(1*time.Second)
//    fmt.Println("主线程结束执行")
//    //go语言中,主线程不会等待goroutine执行完成,要等待它结束需要自己处理
//}

//func main() {
//    fmt.Println("主线程开始执行")
//    for i:=0;i<10;i++ {
//        go func(){
//            fmt.Println("go go go ")
//
//        }()
//    }
//    time.Sleep(1*time.Second)
//    fmt.Println("主线程结束执行")
//    //go语言中,主线程不会等待goroutine执行完成,要等待它结束需要自己处理
//}


// go 关键字开启goroutine,一个goroutine只占2kb

/*
go语言的GMP模型
    -G:开的goroutine
    -M:M当成操作系统真正的线程,实际上是用户线程(用户线程)
    -P:Processor:现在版本默认情况是cpu核数(可以当做cpu核数)

    用户线程,操作系统线程
    python中,开的线程开出用户线程,用户线程跟操作系统线程1:1的对应关系
    某些语言,用户线程和操作系统线程是n:1的关系
    go语言,用户线程和操作系统线程是 n:m的关系
 */


//举个例子

func main() {
        //设置P的大小,认为是cpu核数即可
        runtime.GOMAXPROCS(1)
        fmt.Println("主线程开始执行")
        go func() {
            for  {
                fmt.Println("xxxx")

            }
        }()
        //for i:=0;i<10;i++ {
        //    go func(){
        //        for  {
        //            fmt.Println("我是死循环")
        //
        //        }
        //
        //    }()
        //}
        time.Sleep(10*time.Second)
        fmt.Println("主线程结束执行")
}

GMP模型

Go的调度器通常被称为G-M-P模型,实际包含四个结构,分别为:
G:Goroutine,每个Gotoutine

M:machine,计算机线程

P:Processor,表示逻辑处理器(程序阶段可以定义它的大小,如果不写,就是cup核数),程序级别的线程
    
    
    

原文地址:https://www.cnblogs.com/ZhZhang12138/p/14886756.html