当前位置: 首页 > article >正文

Go之goroutine

go语句意味着一个函数或方法的并发执行.go语句是由关键字和表达式组成的.简单说.表达式就是用于描述针对若干操作数的计算方法的式子.Go的表达式有很多种.其中就包括调用表达式.调用表达式所表达的是针对函数或方法的调用.其中的函数可以是命名的.也可以是匿名的.能够称为表达式语句的表达式.是创建go语句时唯一合法的表达式.如下函数不能被称为表达式语句:append cap complex imag len make new real unsafe.Alignof unsafe.Offsetof和unsafe.Sizeof.前八个函数是Go语言创建的内建函数.最后三个则是标准库代码包unsafe中的函数.示例:func main() { go func() { fmt.Println(hello,go关键字) }() }注意:无论是否需要传递值给匿名函数.都不要忘了最后的那对圆括号.它们代表了对函数的调用行为.也是调用表达式的必要组成部分.在go关键字后面的调用表达式是不能用圆括号括起来的.执行结果:没有出现期望的hello,go关键字.Go运行时系统对go语句中的函数(以下简称go函数)的执行是并发的.当go语句执行的时候.其中的go函数会被单独放入一个goroutine中.在这之后.该go函数的执行会独立于当前goroutine运行.一般情况下.位于go语句后面的那些语句并不会等到前者的go函数执行完成才开始执行.甚至在该go函数真正执行之前.运行时系统可能就已经开始执行后面的语句了.go函数并发执行.但谁先后不确定.Go语言中有很多方法可以干预G的执行顺序.最简单的一种方法就是用time包中的sleep函数.示例如下:func main() { go func() { fmt.Println(hello,go关键字) }() time.Sleep(time.Second) }执行结果:函数time.Sleep的作用是让调用它的goroutine暂停(进入Gwaiting状态)一段时间.示例:func main() { name : one go func() { fmt.Printf(Hello, %s!\n, name) }() name two time.Sleep(time.Millisecond) }执行结果:这进一步说明了执行的并发性.当go函数开始执行的时候.nametwo语句已经执行了.主goroutine的运作:封装main函数的goroutine称为主goroutine.主goroutine会由runtime.m0负责运行.主goroutine所做的事情并不是执行main函数那么简单.它首先要做的是:设定每一个goroutine所能申请的栈空间的最大尺寸.在32位的计算机系统中此最大尺寸为250MB.在64位计算机系统此尺寸大小为1GB.如果某个goroutine的栈空间大小尺寸大于这个限制/那么运行时系统就会发出一个栈溢出的运行时恐慌.随即.这个Go程序的运行也会终止.设定好goroutine的最大尺寸之后.主goroutine会在当前M的g0上执行系统监测任务.已知.系统监测任务的作用就是为了调度器查缺补漏.这也是监测任务的执行先于main函数的原因之一.此后.主goroutine会进行一系列的初始化工作.涉及的工作内容大致如下.1).检查当前M是否是runtime.m0.如果不是.就说明之前程序出现了某种问题.这时.主goroutine会立即抛出异常.这也意味着Go程序启动的失败.2).创建一个特殊的defer语句.用于在主goroutine退出时做必要的善后处理.因为主goroutine也可能非正常的结束.这一点很有必要.3).启用专用于在后台清扫内存垃圾的goroutine.并设置GC可用的标识.4).执行main包中的init函数.如果上述工作初始化成功完成.那么主goroutine就会去执行mian函数.在执行完main函数后.它还会检查主goroutine是否引起了运行时恐慌.并进行必要的处理.最后主goroutine会结束自己以及当前进程的运行.在main函数执行期间.运行时系统会根据Go程序中的go语句.复用或新建goroutine来封装go函数.这些goroutine都会放入相应P的可运行G队列中.然后等待调度器的调度.这样的等待时间通常会非常短暂.但是有时如此短的时间也不容忽视.就像前面例子一样.它可能会使goroutine错过甚至永远失去运行时机.runtime包与goroutine:Go的标准库代码包runtime中的程序实体.提供了各种可以使用户程序与Go运行时系统交互的功能.如下:1).runtime.GOMAXPROCS函数:通过调用runtime.GOMAXPROCS函数.用户程序可以在运行期间.设置常规运行时系统中的P的最大数量.因为这样会引起Stop the world.所以建议应用程序尽量早的并且更好的方式设置环境变量GOMAXPROCS.Go运行时系统中的P最大数量范围总会是1~256.2).runtime.Goexit函数:调用runtime.Goexit函数之后.会立即使当前goroutine的运行终止.而其他goroutine并不会受此影响.runtime.Goexit函数在终止当前goroutine之前.会先执行该goroutine中所有还未执行的defer语句.该函数会把终止的goroutine置于Gdead状态.并将其放入本地P的自由G列表.然后触发调度器的一轮调度流程.3).runtime.Gosched函数:runtime.Gosched函数的作用是暂停当前goroutine的运行.当前goroutine会被置为Grunnable状态.并放入调度器的可运行G队列.这也是使用暂停这个关键字的原因.经过调度器的调度.该goroutine马上会再次运行.4).runtime.NumGoroutine函数:runtime.NumGoroutine函数在被调用后.会返回当前Go运行时系统中处于非Gdead状态用户G的数量.这些goroutine被视为活跃的或者可被调度运行的.该函数的返回值总会大于等于1.5).runtime.LockOSThread函数和runtime.UnLockOSThread函数:对前者的调用会使当前goroutine与当前M锁定在一起.而对后者的调用则会解除这样的锁定.多次调用前者不会造成任何问题.但是只有最后一次调用会生效.可以向象成对同一个变量的多次赋值.另一方面.即使在之前没有调用过前者.对后者调用也不会产生任何副作用.6).runtime/debug.SetMaxStack函数:这个函数的功能是约束单个goroutine所能申请栈空间的最大尺寸.已知.在mian函数及init函数真正执行之前.主goroutine会对此数值进行默认设置.250MB和1GB分别是在32位和64位计算机系统的默认值.该函数接收一个int类型的参数.该参数的含义是欲设定的栈空间的最大字节数.该函数在执行完毕的时候.会把之前设定的结果返回.如果运行时系统在为某个goroutine增加栈空间的时候.发现它的尺寸超过了设定值.就会发起一个运行时恐慌并终止程序运行.7).runtime/debug.SetMaxThreads:runtime/debug.SetMaxThreads函数的作用是对Go运行时系统所使用的内核线程的数量(也可以认为是M的数量)进行设置.在引导程序中.该数量被设置成了1000.这对于操作系统和Go程序来说.都已经是一个足够大的值了.该函数接受一个int类型的值.也会返回一个int类型的值.前者代表欲设定的新值.而后者代表之前设定的旧值.如果调用此函数设定的新值比运行时系统当前正在使用的M的数量还要小的话.就会引发一个运行时恐慌.另一方面.在对此函数的调用完成后.设定的新值就会立即发挥作用.每当运行时系统新建一个M.就会检查它当前所持M的数量.如果该数量大于M最大数量的设定.运行时系统就会发起一个同样的运行时恐慌.8).runtime/debug.SetGCPercent runtime.GC runtime/debug.FreeOSMemory:前者用于设定触发自动GC的条件.后两者则用于手动触发GC.注意.自动GC在默认情况下是并发运行的.而手动GC则总是串行运行的.这也意味着.在后两个函数的执行期间.调度是停止的.runtime/debug.FreeOSMemory函数比runtime.GC函数多做了一件事.就是在GC之后还要清扫一次堆内存.语雀地址https://www.yuque.com/itbosunmianyi/xg8vfe?《Go.》 密码xbkk 欢迎大家访问.提意见.拔灯书尽红笺也.依旧无聊.玉漏迢迢.梦里寒花隔玉萧.几竿修竹三更雨.叶叶萧萧.分付秋潮.莫误双鱼到谢桥. 纳兰.如果大家喜欢我的分享的话.可以关注我的微信公众号念何架构之路

相关文章:

Go之goroutine

go语句意味着一个函数或方法的并发执行.go语句是由关键字和表达式组成的.简单说.表达式就是用于描述针对若干操作数的计算方法的式子.Go的表达式有很多种.其中就包括调用表达式.调用表达式所表达的是针对函数或方法的调用.其中的函数可以是命名的.也可以是匿名的.能够称为表达式…...

openwrt ipv6与v4共存relay情况下ping6不通问题解决

有些校园网虽然开了slaac无状态,但仍然有监权机制。需要ipv4拨号。否则v6也不通。一个路由器下面的多个设备并不想多次拨号。按照前辈们的做法只分配/64的v6网络用relay就行了。尤其是openwrt22以后wan上的master也不用ssh。跑题了。^_^解决方案是用ndppd。下面是完…...

Phi-3-vision-128k-instructGPU优化:INT4量化后精度损失<1.2%的实测报告

Phi-3-vision-128k-instruct GPU优化&#xff1a;INT4量化后精度损失<1.2%的实测报告 1. 模型概述 Phi-3-Vision-128K-Instruct 是一个轻量级的开放多模态模型&#xff0c;属于Phi-3模型家族的最新成员。这个模型特别之处在于它同时支持文本和视觉数据的处理&#xff0c;并…...

生物信息学数据标准与格式解析:FASTA、FASTQ、BAM、VCF、GFF——从测序仪到分析管线的通用语言

点击 “AladdinEdu&#xff0c;你的AI学习实践工作坊”&#xff0c;注册即送-H卡级别算力&#xff0c;沉浸式云原生集成开发环境&#xff0c;80G大显存多卡并行&#xff0c;按量弹性计费&#xff0c;教育用户更享超低价。 摘要&#xff1a;随着高通量测序技术的飞速发展&#x…...

极空间NAS上5分钟搞定TaleBook书库:豆瓣刮削+Calibre Web完美整合

极空间NAS打造智能书库&#xff1a;TaleBook与豆瓣数据无缝对接指南 为什么选择TaleBook管理电子书收藏 作为一名藏书爱好者&#xff0c;我深知整理电子书库的痛点。传统文件夹管理方式难以展现书籍封面和元数据&#xff0c;而专业图书管理软件又往往操作复杂。直到在极空间N…...

JHenTai全场景部署攻略:从入门到精通的跨设备实践

JHenTai全场景部署攻略&#xff1a;从入门到精通的跨设备实践 【免费下载链接】JHenTai A cross-platform app made for e-hentai & exhentai by Flutter 项目地址: https://gitcode.com/gh_mirrors/jh/JHenTai JHenTai作为一款基于Flutter开发的跨平台应用&#xf…...

从Rayleigh商到Courant-Fischer:Hermite矩阵特征值的变分刻画

1. 从Rayleigh商理解Hermite矩阵特征值 我第一次接触Rayleigh商这个概念是在研究振动系统稳定性时。当时导师在黑板上写下一个看似简单的表达式&#xff1a;R(x)(xᴴAx)/(xᴴx)&#xff0c;告诉我这个比值能揭示系统固有频率的关键信息。后来我才明白&#xff0c;这其实就是理解…...

Phi-3-vision-128k-instruct案例分享:多模态安全机制拦截违规图像请求

Phi-3-vision-128k-instruct案例分享&#xff1a;多模态安全机制拦截违规图像请求 1. 模型简介 Phi-3-Vision-128K-Instruct 是一个轻量级的开放多模态模型&#xff0c;属于 Phi-3 模型家族的最新成员。这个模型特别之处在于它支持128K的超长上下文处理能力&#xff0c;能够同…...

强基计划简析

首先&#xff0c;强基计划是什么&#xff1f;强基计划全称为“基础学科招生改革试点”&#xff0c;是教育部自2020年起实施的招生改革项目。它替代了原有高校自主招生方式&#xff0c;主要选拔有志于服务国家重大战略需求且综合素质优秀或基础学科拔尖的学生。招生方面&#xf…...

AE视频剪辑脚本化:LiuJuan20260223Zimage根据文案自动生成After Effects操作指令

AE视频剪辑脚本化&#xff1a;用AI让视频制作更高效 最近和几个做视频的朋友聊天&#xff0c;发现大家都有个共同的烦恼&#xff1a;创意想法很多&#xff0c;但真正花在剪辑软件里的时间&#xff0c;大部分都耗在了重复性的操作上。比如&#xff0c;给几十个片段统一添加转场…...

MusePublic艺术创作引擎升级攻略:如何获得更快的生成速度

MusePublic艺术创作引擎升级攻略&#xff1a;如何获得更快的生成速度 1. 为什么你的MusePublic生成速度不够快 你有没有遇到过这样的情况&#xff1a;输入一段精心构思的提示词&#xff0c;点击生成按钮&#xff0c;然后盯着进度条等待——30秒、1分钟、甚至更久。等待的过程…...

基于STM32F103与MPU6050的立创数字水平仪DIY全流程解析

基于STM32F103与MPU6050的立创数字水平仪DIY全流程解析 最近在工位上捣鼓一些小玩意儿&#xff0c;想着能不能自己做一个既实用又有趣的电子工具。于是&#xff0c;一个数字水平仪的想法就冒出来了。它不仅能测量平面的倾斜角度&#xff0c;还能把数据直观地显示在屏幕上&#…...

开源Mod管理工具KKManager:全方位解决游戏插件管理难题

开源Mod管理工具KKManager&#xff1a;全方位解决游戏插件管理难题 【免费下载链接】KKManager Mod, plugin and card manager for games by Illusion that use BepInEx 项目地址: https://gitcode.com/gh_mirrors/kk/KKManager 在游戏Mod管理领域&#xff0c;玩家常面临…...

用生活案例学算法:动态规划就像理财,贪心算法像点外卖?

用生活案例学算法&#xff1a;动态规划就像理财&#xff0c;贪心算法像点外卖&#xff1f; 当你第一次听到"动态规划"和"贪心算法"这些术语时&#xff0c;是不是觉得它们离日常生活很遥远&#xff1f;其实&#xff0c;这些看似高深的算法概念&#xff0c;在…...

Qwen3-14b_int4_awq行业方案:为律所定制合同关键条款提取+风险提示生成服务

Qwen3-14b_int4_awq行业方案&#xff1a;为律所定制合同关键条款提取风险提示生成服务 1. 方案背景与价值 在法律服务行业&#xff0c;合同审查是一项高频且耗时的工作。传统人工审查方式面临以下挑战&#xff1a; 合同条款识别效率低&#xff1a;律师需要逐条阅读冗长合同风…...

突破限制:WeChatPad实现微信全设备适配的完整方案

突破限制&#xff1a;WeChatPad实现微信全设备适配的完整方案 【免费下载链接】WeChatPad 强制使用微信平板模式 项目地址: https://gitcode.com/gh_mirrors/we/WeChatPad 多设备登录困境与解决方案 当你尝试在手机和电脑同时登录微信时&#xff0c;是否遇到过"该…...

Win11系统优化:Nanbeige 4.1-3B部署性能调优

Win11系统优化&#xff1a;Nanbeige 4.1-3B部署性能调优 1. 开篇&#xff1a;为什么要在Win11上部署Nanbeige模型 最近很多朋友在Windows 11上跑AI模型时遇到了性能问题&#xff0c;特别是部署Nanbeige 4.1-3B这样的中等规模模型时&#xff0c;总觉得速度不够理想。其实Win11…...

Janus-Pro-7B解决C语言文件读写难题:示例代码生成与错误处理

Janus-Pro-7B解决C语言文件读写难题&#xff1a;示例代码生成与错误处理 1. 引言 如果你写过C语言&#xff0c;肯定对文件操作又爱又恨。爱的是它给了你直接操作系统的能力&#xff0c;恨的是那些看似简单的fopen、fread、fclose背后&#xff0c;藏着无数个让你程序崩溃的陷阱…...

Alibaba DASD-4B Thinking 快速开始:Node.js环境下的API调用与流式响应处理

Alibaba DASD-4B Thinking 快速开始&#xff1a;Node.js环境下的API调用与流式响应处理 最近在折腾一些AI应用的后端集成&#xff0c;发现不少开发者对如何在自己的Node.js服务里快速接入大模型API&#xff0c;特别是处理流式响应&#xff0c;感觉有点无从下手。正好&#xff…...

如何安装配置Goland并使用固定公网地址SSH远程连接本地服务器

文章目录 1. 安装配置GoLand2. 服务器开启SSH服务3. GoLand本地服务器远程连接测试4. 安装cpolar内网穿透远程访问服务器端 4.1 服务器端安装cpolar4.2 创建远程连接公网地址 5. 使用固定TCP地址远程开发 本文主要介绍使用GoLand通过SSH远程连接服务器&#xff0c;并结合cpol…...

网页编辑器如何处理KindEditor的Excel数据源格式保留?

&#x1f680; 老北京PHP程序员的逆袭&#xff1a;给KindEditor插上Word的翅膀&#xff01; 各位爷们儿姐们儿&#xff0c;您瞅瞅&#xff0c;咱一个北京土著PHP程序员&#xff0c;最近接了个CMS企业官网的活儿&#xff0c;客户爸爸提出了个"变态"需求&#xff1a;要…...

零基础上手骨骼动画转换:Mixamo到UE4的开源工具全攻略

零基础上手骨骼动画转换&#xff1a;Mixamo到UE4的开源工具全攻略 【免费下载链接】mixamo_converter Blender addon for converting mixamo animations to Unreal 4 rootmotion 项目地址: https://gitcode.com/gh_mirrors/mi/mixamo_converter 在游戏开发中&#xff0c…...

西门子200 SMART PLC MODBUS TCP协议多从站轮询实战程序案例解析与应用示例

西门子200SMART MODBUS TCP协议多从站轮询实战程序案例刚接手车间设备联网改造那会儿&#xff0c;碰到个头疼的问题——六台200SMART PLC要通过MODBUS TCP把数据汇总到上位机。官方例程都是单从站配置&#xff0c;真遇到多设备轮询才发现坑多得能养鱼。折腾了俩礼拜&#xff0c…...

C++——类模板的概念和意义

1.一些类主要用于存储和组织数据元素&#xff0c;类中数据组织的方式和数据元素的具体类型无关&#xff0c;只关注需要实现的功能&#xff0c;如数组类、链表类、Stack类、Queue类2.类模板的应用&#xff08;1&#xff09;只能显示指定具体类型&#xff0c;无法自动推导&#x…...

CV实战:Harris角点检测在图像拼接中的应用(Python+OpenCV实现)

1. 图像拼接为什么需要角点检测 第一次尝试用Python做图像拼接时&#xff0c;我直接把两张照片叠在一起&#xff0c;结果发现接缝处总是错位。后来才明白&#xff0c;计算机不像人眼能直观匹配图像&#xff0c;它需要明确的"路标"来对齐画面。这就是角点检测的价值所…...

Docker 27低代码容器化真香现场:Java/Spring Boot项目3分钟生成可验证镜像,含SBOM+SCA+签名三重合规凭证(附GPG密钥生成脚本)

第一章&#xff1a;Docker 27低代码容器化的革命性演进Docker 27并非官方发布的版本号&#xff0c;而是社区对Docker平台与低代码能力深度融合趋势的前瞻性代称——它标志着容器技术正从纯命令行驱动的运维范式&#xff0c;跃迁为可视化编排、策略即配置、应用即模板的新型开发…...

每日打卡15

128&#xff1a;#include <bits/stdc.h>using namespace std;int m, cnt;// 移动n块&#xff0c;从a->c&#xff0c;借助b void hanoi(int n, char a, char b, char c) {if (n 1) {// 如果当前步骤就是第m步&#xff0c;直接输出 if (cnt m) cout << a <&l…...

实时手机检测-通用高性能部署:共享内存IPC优化多进程并发检测吞吐

实时手机检测-通用高性能部署&#xff1a;共享内存IPC优化多进程并发检测吞吐 1. 引言 你有没有遇到过这样的场景&#xff1f;在一个大型活动现场&#xff0c;需要实时监控成千上万的手机设备&#xff1b;或者在电商仓库里&#xff0c;要对流水线上的手机进行快速分拣和质检。…...

Fish Speech 1.5保姆级教程:开箱即用的声音克隆与多语言TTS实操指南

Fish Speech 1.5保姆级教程&#xff1a;开箱即用的声音克隆与多语言TTS实操指南 1. 引言&#xff1a;为什么选择Fish Speech 1.5&#xff1f; 你是不是曾经遇到过这样的困扰&#xff1a;想要给视频配音&#xff0c;但自己的声音不够好听&#xff1b;需要制作多语言内容&#…...

Lychee-Rerank企业面试系统应用:Java八股文智能匹配

Lychee-Rerank企业面试系统应用&#xff1a;Java八股文智能匹配 最近跟几个做技术招聘的朋友聊天&#xff0c;发现他们有个共同的烦恼&#xff1a;每天要筛几十份简历&#xff0c;面试的时候还得现场判断候选人回答的Java八股文到底靠不靠谱。光靠面试官自己记和判断&#xff…...