goroutine

goroutine示例

// 主线程结束后 所有协程都会一起结束
// 在4个go程中结束时向chan c写入true
// 开启go程后  在主线程中循环对管道c取值,取出4个true 说明go程执行完毕 再执行主线程并退出

func main() {
    c := make(chan bool, 5)
    fmt.Printf("type %T  len %d  cap %d\n", c, len(c), cap(c))
    go test("go程1-", c)
    go test("go程2-", c)
    go test("go程3-", c)
    go test("go程4-", c)

    for i := 0; i < 4; i++ {
        v := <-c
        log.Println(v)
    }

    fmt.Println("goroutine over")
}

func test(name string, c chan bool) {
    for i := 0; i < 10; i++ {
        fmt.Println(name, i)
    }
    c <- true
}

 goroutine调度模型

MPG

  • M:操作系统的主线程(物理线程)
  • P:协程执行需要的上下文
  • G:协程

一个GO程序执行时可能有多个M(主线程)在运行

每个M中都有一个P(协程上下文)

每个P都挂着一个G(协程)队列

P为G的执行提供上下文环境

同一时刻,一个P下只有一个G在执行,但是G队列中的G可以快速切换执行

一个Go程序有多个M,这些M有些在同一个CPU,有些在不同的CPU上运行,相当于多进程并行执行

在同一个CPU上的M相当于多个线程并发执行

同一个M中的多个G 是多协程 并发执行

在同一个CPU上,当一个M0执行的G0执行耗时的操作如查询数据库,M0主线程被阻塞,对应的P下的G队列中其他协程就无法执行,这时会创建新的M1主线程(或者从线程池取),将M0下的G队列交给M1执行

协程遇到阻塞,使用多线程让其他协程继续并发执行

设置golang运行的cpu数

go1.8之后默认使用全部CPU

runtime.NumCPU() // get当前机器的CPU数量
runtime.GOMAXPROCS(number) // 设置golang程序执行时使用的CPU数

转载于:https://www.cnblogs.com/endurance9/p/10356601.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值