Go进阶之协程

1.协程的概念:

1.1基本概念:

1).进程:

进程是应用启动的实例.每个进程都有自己独立的内存空间.不同的进程通过进程间的

通信方式来通信.

2).线程:

线程从属于进程.每个进程至少包含一个线程.线程是CPU调度的基本单位.多个线程之

前共享进程资源并通过共享内存等线程间的通信方式通信.

3).协程:

协程可以理解为一种轻量级的线程.与线程相比.协程不受操作系统的调度.协程调度由

用户应用程序提供.协程调度器按照调度策略把协程调度到线程中运行.Go应用程序的

协程调度由runtime包提供.使用go关键字即可创建协程.

1.2协程的优势:

在高并发应用中频繁的创建线程会造成不必要的开销.所以有了线程池技术.在线程池

中预先保存一定量的线程.新任务将不再创建线程的方式去执行.而是将任务放到任务

队列中去执行.线程池中的线程将不断地从任务队列中取出任务并执行.这样可以减少

线程的创建和销毁带来的开销.

任务队列中的每个任务往往代表一个函数.线程池中的worker线程不断的从任务队列

中取出任务并执行.而worker线程则交给操作系统进行调度.如果worker线程执行的

任务中发生系统调用.则操作系统会将该线程设置为阻塞状态.也就意味着线程怠工.消

费任务队列中的worker线程变少了.所以线程消费任务队列的能力变弱了.如果大部

分worker线程都在进行系统调用.会造成队列堆积.

解决这个问题的思路就是重新审视线程池中的数量.增加线程池中线程的数量.提高消

费任务的能力.但随着线程数量增多.会有过多的线程争抢CPU资源.消费能力还是会下

降.

过多的线程会造成COU上下文的频繁的切换.工作态中的用户协程则能大大的减少上

下文的切换的开销.协程调度器把可运行的协程逐个调度到线程中执行.同时把阻塞的

协程调度出线程.有效的避免了线程的频繁切换.达到了使用少量线程实现高并发的效

果.

2.调度模型:

2.1线程模型:

线程可以分为用户线程和内核线程.用户线程由用户创建 同步和销毁.内核线程则有内

核来管理.根据管理方式不同分为三种模型.

1).N:1模型.N个用户线程运行在一个内核线程中.优点是用户线程上下文切换快.缺点

是无法充分利用COU多核算力.

2).1:1模型.即每个用户线程对应一个内核线程,优点是充分利用CPU的算力.缺点是线

程上下文切换较慢.

3).M:N模型.即前两种模型的组合.M个用户线程(协程)运行在N个线程中.优点是充

分利用CPU的算力且协程上下文切换快.缺点是该模式调度算法较为复杂.

2.2Go调度模型:

Go调度模型中包含三个关键实体.machine简称M.processor简称P和goroutine

简称G.

M:工作线程.它由操作系统调度.

P:处理器.(Go定义的一个概念.不是指CPU).它包含运行Go代码的必要资源.也有调度

goroutine的能力.

G:Go协程.每个go关键字都会创建一个协程.

M必须持有P才可以执行代码.跟系统中的其他线程一样.M也会被系统调用阻塞.P的

个数在启动时决定.默认情况下等同于CPU核数.可以使用环境变量GOMAXPROCS

或在程序中使用runtime.GOMAXPROCS()方法指定个数.

注:M的个数一般大于P的个数.因为除了运行GO代码.runtime包还有其他内置任务

需要处理.

模型图如下:

2.3调度策略:

1).队列轮转:

每个处理器P维护着一个协程G队列.处理器P依次将协程G调度到M中执行.

协程G执行结束后.处理器P会再次调度一个G到M中执行.同时每个P会周期性的查看

全局队列中是否有待运行并将其调度到M中执行.全局队列中的G主要来自系统调用恢

复的G.P周期性的查看全局队列也是为了防止全局队列中的G长时间得不到调度会

而"饿死".

2).系统调用:

当线程在执行系统调用时.可能会被阻塞.对应到调度器模型.如果一个协程发起系统调

用.那么对应的工作线程会被阻塞.然后处理器的P中的G队列中的协程得不到调度就会

全部阻塞.

注:一般情况下.M的个数会略大于P的个数.多出来的M将会在G产生系统调用的时候

发挥作用.和线程池类似.Go也提供了一个M的池子.需要时从池子取.用完返回.不够创

建.

3).工作量切取:

通过go关键字创建的协程通常会优先放到当前协程对应的处理器中.可能有些协程自

身不断的产生新的协程.有些协程不会派生新的协程.多个P中维护的G可能是不均衡

的.不加以控制有的P很繁忙.有得会怠工.

为了解决这个问题.提供了工作量窃取策略.当某个处理器P没有需要调度的协程时.从

其他处理器偷取协程.

4).抢占式调度:

避免某个线程长时间运行.阻碍其他协程被调度的机制.

调度器会监控每个协程的执行时间.一旦执行时间过长或者有其他协程在等待时.会把

协程暂停.转而调度等待的协程.达到类似于时间片转轮的效果.

念念不忘.会有回响.

如果大家喜欢我的分享的话.可以关注我的微信公众号

念何架构之路

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1156410.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

抗干扰PCB工艺设计:工业电子一文说清

工业电子抗干扰PCB设计:从原理到实战,一文讲透在工厂车间里,一台PLC控制器突然死机,产线被迫停摆。排查数小时后发现,并非软件出错,也不是元器件损坏——而是PCB板上的一个地平面被割裂,导致ADC…

2026年安徽省职业院校技能大赛(高职组) 电子数据取证与分析(学生赛)赛项规程

2026年安徽省职业院校技能大赛(高职组) 电子数据取证与分析(学生赛)赛项规程一、赛项名称二、竞赛目标三、竞赛方式与内容五、竞赛规则软件列表:五、赛场预案六、赛项安全七、竞赛须知八、申诉与仲裁需要拿奖可以私信博…

Vue.js 前端开发实战 ( 电子版 ) —— 黑马

点击这里 | Vue.js 前端开发实战 ( 上 ) —— 黑马 | ⚡️⚡️⚡️ 点击这里 | Vue.js 前端开发实战 ( 下 ) —— 黑马 | ⚡️⚡️⚡️ 最后结语 Github: https://github.com/Parker-Cui Gitee: https://gitee.com/cui_pe_ng_fei Juejin: https://juejin.cn/user/2276467567…

基于真实项目的KeilC51与MDK双环境部署教程

一套能跑通的 Keil C51 与 MDK 共存方案:从踩坑到实战你有没有遇到过这种情况:手头同时在做两个项目,一个是老款 8051 单片机控制板,另一个是基于 STM32 的智能网关。想用 Keil 开发,却发现装了 MDK 后 C51 找不到了&a…

STM32中I2C重入问题与中断处理图解说明

STM32中I2C重入问题与中断处理实战解析一个传感器读取失败的“灵异事件”你有没有遇到过这样的情况:系统运行几分钟都正常,突然一次温湿度数据跳变成0?或者日志里某个时间戳写进了错误的值?调试时用逻辑分析仪一抓——发现I2C总线…

从零实现STM32高精度定时的时钟树设置

手把手教你配置STM32高精度定时:从时钟树到定时器中断的完整链路你有没有遇到过这样的问题?明明写好了1ms的定时任务,结果实测发现每隔一段时间就“卡”一下;或者用HAL_Delay()控制PWM波形,却发现频率忽快忽慢。更离谱…

从零实现Keil5 Debug调试工程配置全过程

手把手教你从零搭建Keil5调试工程:不只是点“Start Debug”你有没有过这样的经历?辛辛苦苦写完代码,编译通过,信心满满地点击Debug按钮——结果 Keil 弹出一串红字:“Cannot access target”、“No algorithm found”……

AgentCPM-Explore开源,4B 参数突破端侧智能体模型性能壁垒

当全行业还在争论 30B 能否挑战万亿参数时,我们给出了一个更激进的答案: 4B。没有万亿参数的算力堆砌,没有百万级数据的暴力灌入,清华大学自然语言处理实验室、中国人民大学、面壁智能与 OpenBMB 开源社区联合研发的 AgentCPM-Exp…

Keil安装教程图解说明:从下载到环境部署全流程

从零开始搭建Keil开发环境:手把手带你完成安装、配置与避坑指南 你是不是也曾在第一次接触嵌入式开发时,面对“Keil怎么装?”“为什么编译报错?”“程序烧不进去怎么办?”这些问题一头雾水?别担心&#xf…

CMSIS底层初始化流程详解:系统学习手册

深入理解CMSIS底层初始化:从启动到main的每一步你有没有遇到过这样的情况?代码烧录成功,下载器能连上,但单片机就是“不干活”——LED不闪、串口没输出。查了一圈外设配置都没问题,最后发现原来是系统时钟没配对&#…

从零开始搭建工控平台:STLink驱动安装操作指南

从零搭建工控开发环境:手把手搞定STLink驱动安装与调试链配置 你有没有遇到过这样的场景? 刚拿到一块崭新的Nucleo开发板,兴冲冲插上电脑准备烧录第一个“Hello World”程序,结果STM32CubeIDE弹出一串红字:“ No ST…

AUTOSAR架构图基础讲解:手把手认识经典平台结构

手把手拆解AUTOSAR架构图:从分层逻辑到实战落地你有没有遇到过这样的场景?接手一个ECU项目,代码里满是直接操作寄存器的裸机风格函数,换颗MCU就得重写大半;或者多个供应商交付的模块集成时接口对不上,调试几…

提示工程架构师:设计灵活的AI提示系统反馈与响应机制

提示工程架构师:设计灵活的AI提示系统反馈与响应机制——让AI从“答对题”到“会聊天” 关键词 提示工程架构、反馈闭环机制、动态Prompt生成、上下文感知、多模态响应、Prompt版本控制、强化学习优化 摘要 你有没有过这样的体验?跟AI聊天时,…

ego1开发板大作业vivado实现交通灯控制系统图解说明

ego1开发板实战:用FPGA打造一个会“思考”的交通灯系统你有没有想过,路口那几盏看似简单的红绿灯,其实背后藏着一套精密的“大脑”?它要准确判断何时变灯、确保两个方向不会同时放行、还要能应对突发状况——比如救护车经过时临时…

前后端分离房屋租赁管理系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程

💡实话实说:有自己的项目库存,不需要找别人拿货再加价,所以能给到超低价格。摘要 随着互联网技术的快速发展,传统房屋租赁管理方式逐渐暴露出信息不透明、效率低下等问题。在线房屋租赁平台的出现为租户和房东提供了便…

价值投资中的智能农业灌溉优化系统分析

价值投资中的智能农业灌溉优化系统分析 关键词:价值投资、智能农业灌溉、优化系统、数据分析、精准灌溉 摘要:本文聚焦于价值投资视角下的智能农业灌溉优化系统。首先介绍了该系统的背景,包括目的范围、预期读者等内容。接着阐述了核心概念与联系,深入剖析其原理和架构,并…

波长分割复用 + 无源分光:单纤双向如何撑起全光接入?

在光纤通信领域,尤其是PON(无源光网络)系统中,OLT(光线路终端)、分光器与ONU(光网络单元)三者构成了宽带接入的核心架构。而支撑这一架构高效运行的关键技术之一,便是单纤…

企业级养老智慧服务平台管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】

💡实话实说:有自己的项目库存,不需要找别人拿货再加价,所以能给到超低价格。摘要 随着人口老龄化趋势的加剧,传统的养老服务模式已难以满足现代社会的需求,智慧养老成为解决养老问题的重要方向。企业级养老…

基于STM32H7的串口不定长接收图解说明

一文搞懂STM32H7串口不定长接收:DMA 空闲中断的实战精髓 你有没有遇到过这样的场景? 设备通过串口发来一帧长度不固定的数据——可能是10字节的传感器采样,也可能是上百字节的配置命令。你用传统轮询方式处理,CPU占用飙到80%&am…

使用Keil进行Cortex-M低功耗模式开发操作指南

Keil环境下Cortex-M低功耗开发实战指南:从配置到调试的完整路径你有没有遇到过这样的情况:代码里明明调用了__WFI(),系统却像“假睡”一样,电流纹丝不动?或者设备进入Stop模式后,再也叫不醒了?这…