(四十一)golang--goroutine
首先得了解:
- 进程
- 线程
- 并发
- 并行
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:

(四十一)golang--goroutine的更多相关文章
- golang goroutine的调度
golang goroutine的调度 1.什么是协程? 协程是一种用户态的轻量级线程. 2.进程.线程.协程的关系和区别: * 进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度. ...
- 《剑指Offer》题四十一~题五十
四十一.数据流中的中位数 题目:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中 ...
- 微信小程序把玩(四十一)canvas API
原文:微信小程序把玩(四十一)canvas API 绘图是每个移动应用必备的技术,基本上和Android,IOS,等移动开发都是相同的,创建个上下文,给你个画布再上画,官网给的小例子都比较全了自己去看 ...
- 《手把手教你》系列技巧篇(四十一)-java+ selenium自动化测试 - 处理iframe -上篇(详解教程)
1.简介 原估计宏哥这里就不对iframe这个知识点做介绍和讲解了,因为前边的窗口切换就为这种网页处理提供了思路,另一个原因就是虽然iframe很强大,但是现在很少有网站用它了.但是还是有小伙伴或者童 ...
- 说说Golang goroutine并发那些事儿
摘要:今天我们一起盘点一下Golang并发那些事儿. Golang.Golang.Golang 真的够浪,今天我们一起盘点一下Golang并发那些事儿,准确来说是goroutine,关于多线程并发,咱 ...
- GO开发[四]:golang函数
函数 1.声明语法:func 函数名 (参数列表) [(返回值列表)] {} 2.golang函数特点: a. 不支持重载,一个包不能有两个名字一样的函数 b. 函数是一等公民,函数也是一种类型,一个 ...
- golang goroutine 介绍
Goroutine 是用户态自己实现的线程,调度方式遇到IO/阻塞点方式就会让出cpu时间(其实也看编译器的实现,如果TA在代码里面插入一些yield,也是可以的. 反正现在不是抢占式的.) 不能设置 ...
- 四、golang内置函数、递归、闭包、数组切片和map
一.总体内容 1.内置函数.递归函数.闭包 2.数组和切片 3.map数据结构 4.package介绍 一.内置函数 注意:值类型用new来分配内存,引用类型用make来分配内存 1.close:主要 ...
- abp(net core)+easyui+efcore实现仓储管理系统——入库管理之五(四十一)
abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...
- 读书笔记_Effective_C++_条款四十一:了解隐式接口和编译期多态
从本条款开始,就进入了全书的第七部分:模板与泛型编程.模板与泛型在C++中是非常重要的部分,还记得本书第一章时,把C++视为一个联邦,它由四个州政府组成,其中一个政府就是模板与泛型了. 本条款是一个介 ...
随机推荐
- C#读取匿名对象的属性值的方法总结
目录 1.通过反射的方式获取属性值 2.新建个扩展方法,将object转成对应的匿名对象 通过new出匿名对象,可以直接调用该匿名对象的属性名,获取属性值. var objUser = new {Na ...
- 09-Django静态文件
1.静态文件 项目中的图片.CSS.js都是静态文件,一般会将静态文件放到一个单独的目录下,也方便管理.一般会将静态文件放到一个单独的目录下,也可以放在应用的目录下,由于静态文件是全部应用都在使用的, ...
- 使用csv模块读写csv格式文件
import csv class HandleCsv: ''' csv文件处理类 ''' def __init__(self, filename): ''' 构造器 :param filename: ...
- 配置文件和sqlplus简单使用
oracle简单配置文件 数据文件目录 D:\app\inmeditation\oradata\orcl 以.CTL结尾得的文件是数据库的控制文件 以.LOG结尾的是数据库日志文件 以.DBF结尾的是 ...
- My97Datepicker 日历控件的使用
如果显示中乱码可以再改变lang js包 中的 以防乱码 var $lang = {errAlertMsg: "\u4E0D\u5408\u6CD5\u7684\u65E5\u671F\ ...
- C# get files and write the files full name in txt
static void GetAllFiles() { string path = "filepath"; var allFiles = Directory.GetFiles(pa ...
- 机器学习常见的几种评价指标:精确率(Precision)、召回率(Recall)、F值(F-measure)、ROC曲线、AUC、准确率(Accuracy)
原文链接:https://blog.csdn.net/weixin_42518879/article/details/83959319 主要内容:机器学习中常见的几种评价指标,它们各自的含义和计算(注 ...
- 用AI思维给成本降温,腾讯WeTest兼容性测试直击底价!
WeTest 导读 当AI成为各行业提高产业效率的动能,很多人开始疑惑,这架智能化的“无人机”何时在移动应用测试中真正落地?在今年的国际数码互动娱乐博览会(ChinaJoy)上,腾讯WeTest给出了 ...
- QT信号槽连接语法总结
信号槽是 Qt 框架引以为豪的机制之一. 所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal).这种触发是没有目的的,类似广播.如果 ...
- Cesium-空间分析之通视分析(附源码下载)
Cesium Cesium 是一款面向三维地球和地图的,世界级的JavaScript开源产品.它提供了基于JavaScript语言的开发包,方便用户快速搭建一款零插件的虚拟地球Web应用,并在性能,精 ...