什么是协程goroutine?

news2024/11/16 13:04:44

文章目录

    • 一、进程和线程
      • 进程和线程的痛点
      • 为什么 Java 坚持多线程不选择协程?
    • 二、什么是协程
      • CSP并发模型
      • golang 线程模型和GMP
      • 一直创建协程会出什么问题
    • 三、参考

一、进程和线程

进程就是应用程序的启动实例,进程拥有代码和打开的文件资源、数据资源、独立的内存空间。

线程从属于进程,是程序的实际执行者。一个进程至少包含一个主线程,也可以有更多的子线程。

线程拥有自己的栈空间。

对操作系统来说,线程是最小的执行单元,进程是最小的资源管理单元。

进程和线程的痛点

抢占式调度:操作系统会根据每个线程的优先级进行调度,决定他们的执行顺序。

多线程的优点:将主要进行io操作的线程(比如读取硬盘数据)的优先级调低,不会被io操作浪费大量的cpu时间

多线程的缺点:线程切换需要保存上下文,需要时间。

Java中线程具有五种状态:
这五种状态的转化关系如下:

在这里插入图片描述
但是,线程不同状态之间的转化是谁来实现的呢?是JVM吗?

并不是。JVM需要通过操作系统内核中的TCB(Thread Control Block)模块来改变线程的状态,这一过程需要耗费一定的CPU资源。

为什么 Java 坚持多线程不选择协程?

参考URL: https://www.zhihu.com/question/332042250/answer/734115120

二、什么是协程

线程的切换由操作系统负责调度,协程由用户自己进行调度,因此减少了上下文切换。
线程的默认Stack大小是1M,而协程更轻量,接近1K。因此可以在相同的内存中开启更多的协程。
由于在同一个线程上,因此可以避免竞争关系而使用锁。

Goroutine 是一个由 Go 运行时管理的轻量级线程,一般称其为 “协程”。操作系统本身是无法明确感知到 Goroutine 的存在的,Goroutine 的操作和切换归属于 “用户态” 中。Goroutine 由特定的调度模式来控制,以 “多路复用” 的形式运行在操作系统为 Go 程序分配的几个系统线程上。

据测试,一次协程的切换,耗时大概在100ns,相对于线程的微秒级耗时切换,性能表现非常优秀,但是仍有一些开销。

CSP并发模型

CSP模型是上个世纪七十年代提出的,用于描述两个独立的并发实体通过共享的通讯 channel(管道)进行通信的并发模型。 CSP中channel是第一类对象,它不关注发送消息的实体,而关注与发送消息时使用的channel。

Golang 就是借用CSP模型的一些概念为之实现并发进行理论支持,其实从实际上出发,go语言并没有,完全实现了CSP模型的所有理论,仅仅是借用了 process和channel这两个概念。process是在go语言上的表现就是 goroutine 是实际并发执行的实体,每个实体之间是通过channel通讯来实现数据共享。

golang 线程模型和GMP

多内核线程+多协程,以及Golang的GMP模型
参考URL: https://juejin.cn/post/6906420781182353422

go线程模型包含三个概念:内核线程(M),goroutine(G),G的上下文环境(P);Go语言运行时,通过核心元素G,M,P 和 自己的调度器,实现了自己的并发线程模型。

GMP模型
GMP模型是goalng特有的。

  • G是goroutine,基于协程建立的用户态线程。实际上我们每次调用 go func 就是生成了一个G。
  • M是machine,它直接关联一个os内核线程,用于执行G。
  • P是processor,P里面一般会存当前goroutine运行的上下文环境(函数指针,堆栈地址及地址边界),P会对自己管理的goroutine队列做一些调度。一般P的数量就是处理器的核数,可以通过GOMAXPROCS进行修改。

一直创建协程会出什么问题

func main() {
	maxCount := math.MaxInt64
	for i := 0; i < maxCount; i++ {
		go func(i int) {
			// 做一些各种各样的业务逻辑处理
			fmt.Printf("go func num: %d\n", i)
			time.Sleep(time.Second)
		}(i)
	}
}

当程序运行起来后,可以看到CPU和内存开销,持续上涨~

默认每个 goroutine 占用 8KB 内存,那么一台8GB内存的机器大约能创建8GB/8KB = 1000000 个 goroutine,系统还需要保留一部分保证其他日常任务运行,因此当协程数创建到内存使用上限后,就会panic。

结论: 协程并不是可以无限创建,它收2个因素影响,文件句柄数量达到限制(panic: too many concurrent operations on a single file or socket)和内存(Out of Memory)。

三、参考

关于GO协程数控制的二三事
参考URL: https://zhuanlan.zhihu.com/p/568151296

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

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

相关文章

Pytest中doctests的测试方法应用!

在 Python 的测试生态中&#xff0c;Pytest 提供了多种灵活且强大的测试工具。其中&#xff0c;doctests 是一种独特而直观的测试方法&#xff0c;通过直接从文档注释中提取和执行测试用例&#xff0c;确保代码示例的正确性。本文将深入介绍 Pytest 中 doctests 的测试方法&…

【大厂AI课学习笔记】1.2 人工智能的应用(1)

目录 1.2 人工智能的应用 1.2.1 产业中人工智能的应用 金融 教育 医疗 交通 制造 ——智慧金融 智能风控 智能理赔 智能投研 &#xff08;声明&#xff1a;本学习笔记学习原始资料来自于腾讯&#xff0c;截图等资料&#xff0c;如有不合适摘录的&#xff0c;请与我联…

SQL注入-sqli-labs-master第一关

实验环境&#xff1a; Nginx.1.15.11 MySQL&#xff1a;5.7.26 实验步骤&#xff1a; 1.第一步&#xff1a; 在id1后加入一个闭合符号&#xff0c;如果报错&#xff0c;再在后面加上 -- 将后面注释掉&#xff0c;如果不报错&#xff0c;则证明为字符型。 http://127.0.0.1/…

离线生成双语字幕,一键生成中英双语字幕,基于AI大模型,ModelScope

离线生成双语字幕整合包,一键生成中英双语字幕,基于AI大模型 制作双语字幕的方案网上有很多&#xff0c;林林总总&#xff0c;不一而足。制作双语字幕的原理也极其简单&#xff0c;无非就是人声背景音分离、语音转文字、文字翻译&#xff0c;最后就是字幕文件的合并&#xff0c…

Codeforces Round 921 (Div. 2)补题

We Got Everything Covered!&#xff08;Problem - A - Codeforces&#xff09; 题目大意&#xff1a;要求找出一个长度最短的字符串&#xff0c;满足任意由前k个字母组成的长度为n的字符串都是它的子序列。输出字符串。 思路&#xff1a;这道题我本来想的很简单&#xff0c;…

springboot+vue3支付宝接口案例-第二节-准备后端数据接口

springbootvue3支付宝接口案例-第二节-准备后端数据接口&#xff01;今天经过2个小时的折腾。准备好了我们这次测试支付宝线上支付接口的后端业务数据接口。下面为大家分享一下&#xff0c;期间发生遇到了一些弯路。 首先&#xff0c;我们本次后端接口使用的持久层框架是JPA。这…

【复现】广联达-linkworks SQL注入漏洞_31

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 LinkWorks是梦龙科技根据企业信息化的多样性、灵活性和复杂性&#xff0c;结合多年从事项目管理、办公管理、事务处理等方面的经验…

sql注入的学习

1.首先我们应该确定sql注入的类型 利用id1 and 11 和id1 and 12 判断是数字类型注入还是字符型注入&#xff0c;如果两者都可以正常显示界面&#xff0c;则为字符型注入&#xff0c;否则是数字型 两个都正常显示&#xff0c;所以为字符型注入&#xff08;也可以使用id2-1&…

浏览器——HTTP缓存机制与webpack打包优化

文章目录 概要强缓存定义开启 关闭强缓存协商缓存工作机制通过Last-Modified If-Modified-Since通过ETag If-None-Match 不使用缓存前端利用缓存机制&#xff0c;修改打包方案webpack 打包webpack 打包名称优化webpack 默认的hash 值webapck其他hash 类型配置webpack打包 web…

Mysql运维篇(三) MySQL备份与恢复

一路走来&#xff0c;所有遇到的人&#xff0c;帮助过我的、伤害过我的都是朋友&#xff0c;没有一个是敌人。如有侵权&#xff0c;请留言&#xff0c;我及时删除&#xff01; 一、物理备份与逻辑备份 1、物理备份&#xff1a;备份数据文件&#xff0c;转储数据库物理文件到某…

isctf---misc

你说爱我&#xff1f;尊嘟假嘟 转换为ook编码 def convert_string(input_str):# 定义转换映射关系mapping {"你说爱我": "Ook.","尊嘟": "Ook!","假嘟": "Ook?"}# 遍历字符串&#xff0c;进行转换for key, va…

谷歌seo内容营销怎么做?

谷歌SEO内容营销就像是在为两个观众准备一场表演&#xff0c;一边是用户&#xff0c;一边则是谷歌搜索引擎&#xff0c;那么所谓的内容营销&#xff0c;你自然需要知道你的观众想看什么&#xff0c;这就是关键词研究&#xff0c;帮你了解用户在搜索什么&#xff0c;然后&#x…

什么是NAT?NAT类型有哪些?

晚上好&#xff0c;我的网工朋友。NAT是一种地址转换技术&#xff0c;它可以将IP数据报文头中的IP地址转换为另一个IP地址&#xff0c;并通过转换端口号达到地址重用的目的。 在大多数网络环境中&#xff0c;我们都需要通过 NAT 来访问 Internet。 NAT作为一种缓解IPv4公网地址…

数据预处理:纠偏

纠偏 1、偏态分布2、什么是纠偏3、数据纠偏 1、偏态分布 频数分布有正态分布和偏态分布之分。正态分布是指多数频数集中在中央位置&#xff0c;两端的频数分布大致对称 偏态分布是指频数分布不对称&#xff0c;集中位置偏向一侧。若集中位置偏向数值小的一侧&#xff0c;称为正…

航空MRO行业研究:2027年全球市场将达1200亿美元

随着全球航空运输业的不断发展&#xff0c;越来越多的航空器进入了使用年限&#xff0c;需要进行维修、修理和大修。这促进了航空MRO市场的不断增长。此外&#xff0c;航空器设备和技术的不断更新换代&#xff0c;也对航空MRO市场带来了新的机遇和挑战。 航空MRO市场是指维修、…

【Android】实现简易购物车功能(附源码)

先上结果&#xff1a; 代码&#xff1a; 首先引入图片加载&#xff1a; implementation com.github.bumptech.glide:glide:4.15.1配置权限清单&#xff1a; <!-- 网络权限 --><uses-permission android:name"android.permission.INTERNET"/><uses…

ubuntu22.04@laptop安装配置VNC服务端

ubuntu22.04laptop安装&配置VNC服务端 1. 源由2. 系统安装3. VNC安装3.1 系统更新3.2 lightdm安装3.3 x11vnc安装3.4 x11vnc配置3.5 x11vnc自启动3.6 x11vnc状态查询 4. 演示视频 1. 源由 最近系统搞TensorFlow, OpenCV, Python&#xff0c;折腾各种环境&#xff0c;把系统…

数据库管理-第139期 做大还是做小-Oracle名称哪些事(20240125)

数据库管理139期 2024-01-25 第139期 做大还是做小-Oracle名称哪些事&#xff08;20240125&#xff09;1 问题2 排查3 扩展总结 第139期 做大还是做小-Oracle名称哪些事&#xff08;20240125&#xff09; 作者&#xff1a;胖头鱼的鱼缸&#xff08;尹海文&#xff09; Oracle A…

【备战蓝桥杯】——循环结构

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-bFHV3Dz5xMe6d3NB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

Leetcode刷题笔记题解(C++):1114. 按序打印(多线程)

思路&#xff1a; 保证A,B,C三个线程的顺序不会变&#xff0c;即优先级顺序的问题 A,B需要资源1&#xff0c;B,C需要资源2 A先占用资源1和资源2&#xff0c;A线程完了之后释放资源1不释放资源2&#xff0c;然后B线程占用资源1&#xff0c;A线程完了之后释放资源1和资源2&…