zoukankan      html  css  js  c++  java
  • 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
    ", 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数
    
  • 相关阅读:
    IOS开发防止图片渲染的方法
    IOS界面通信-代理(协议)传值
    IOS打开其他应用、以及被其他应用打开
    IOS UITableView的分隔线多出问题
    self.view 的不当操作造成死循环
    IOS 导航栏属性设置
    在iOS 8及以后使用UIAlertController 等各种弹出警告通知
    iOS通过URL构建UIImage
    自定义 URL Scheme 完全指南
    Unknown type name 'NSString' 解决方案
  • 原文地址:https://www.cnblogs.com/endurance9/p/10356601.html
Copyright © 2011-2022 走看看