首先得了解:

  • 进程
  • 线程
  • 并发
  • 并行

Go协程和Go主线程:

主线程:相当于进程;直接作用于cpu上,是重量级的,是物理态的;

协程:相当于轻量级的线程;由主协程开启,是逻辑态的;

Go协程的特点:

  • 有独立的栈空间
  • 共享程序堆单元
  • 调度由用户控制
  • 协程是轻量级的线程

举个例子:

package main

import (
"fmt"
"strconv"
"time"
) func test() {
for i := ; i < ; i++ {
fmt.Println("test() hello world" + strconv.Itoa(i))
time.Sleep(time.Second)
}
} func main() {
go test()
for i := ; i < ; i++ {
fmt.Println("main() hello world" + strconv.Itoa(i))
time.Sleep(time.Second)
}
fmt.Println("finish")
}

main中的for和test中的for同时运行,当主协程main打印了10次后,不管test协程中打印了几次,test协程都会结束掉。

主协程和协程的关系:

MPG模式:

  • M:主协程,物理协程;
  • P:协程所需上下文;
  • G:协程

说明:

(1) 当前程序有三个M,如果三个M都在同一个cpu上运行,就是并发;在不同cpu上运行,就是并行;

(2)灰色代表协程队列;

(3)go的协程是轻量级的线程,是逻辑态的;

(4)其它程序中的多线程,往往是内核态的,比较重量级;

调度模型:

(1)分成两个部分来看;

(2)原来的M0主协程正在执行G0协程,另外有三个协程正在队列中等待;

(3)如果G0协程阻塞,比如读取文件或数据库等;(也就是说不知道什么时候可以完成)

(4)这时候就会创建一个M1主协程(也可能是从已有的线程池中取出M1),并且将等待的三个协程挂到M1下开始执行,M0的主线程下的G0仍继续执行;

(5)等到G0不阻塞了,M0会被放置到空闲的主线程继续执行,同时G0又会被唤醒;

设置使用几个cpu:

最新文章

  1. activity与fragment之间传递数据
  2. 【leetcode❤python】 414. Third Maximum Number
  3. php下载c
  4. Visual Studio 2012 比较好用的插件推荐
  5. MONO常用快捷键
  6. http://www.myexception.cn/program/767123.html
  7. HDOJ 3547 DIY Cube 解题报告
  8. JSP中嵌入java代码方式以及指令
  9. centos vim 中文乱码解决方案
  10. MVC client validation after PartialView loaded via Ajax MVC3中 弹出 Dialog时候 提交的时候 使用 Jquery 不验证 form表单 的解决办法
  11. Range Minimum Query and Lowest Common Ancestor
  12. Linux系统重启network服务失败
  13. 磁盘IO:缓存IO与直接IO
  14. mysql的水平拆分和垂直拆分
  15. SQL 中左连接与右链接的区别
  16. redis:set集合类型的操作(无序集合)
  17. 注解Annotation
  18. json解析出来数据为空解决方法
  19. javaScript 删除确认实现方法小结
  20. 1032 Sharing (25)(25 point(s))

热门文章

  1. Java连载39-构造方法详解
  2. ARM64的内核栈、用户栈、寄存器上下文
  3. vue中template的作用及使用
  4. Springboot整合单元测试
  5. 使用XShell工具 linux 常用命令
  6. Visual Studio 基础设置
  7. java核心技术第二篇之数据库SQL语法
  8. arcgis api for javascript 学习(二) 发布并调用地图切片
  9. swif(六)swift闭包
  10. Scala字符穿插值器