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

[Golang] goroutine

[Golang] goroutine

文章目录

  • [Golang] goroutine
    • 并发
      • 进程和线程
      • 协程
    • goroutine
      • 概述
      • 如何使用goroutine

并发

进程和线程

谈到并发,大多都离不开进程和线程,什么是进程、什么是线程?

  • 进程可以这样理解:进程就是运行着的程序,它是程序在操作系统的一次执行过程,是一个程序的动态概念,进程是操作系统分配资源的基本单位

  • 线程可以这样理解:线程是一个进程的执行实体,它是比进程粒度更小的执行单元,也是真正运行在cpu上的执行单元,线程是CPU调度资源的1基本单位

进程可以包含多个进程,需要记住的是进程和线程,一个是操作系统分配资源的基本单位,一个是操作系统调度的基本单位。

协程

协程可以理解为用户态线程,是更轻量级的线程。区别于线程,协程的调度在用户态进行,不需要切换到内核态,所以不由操作系统参与,由用户自己控制。在一些支持协程的高级语言中,大多都实现了自己的协程调度器,比如golang就有GMP模型、python就有asyncio等等。

  • 协程有独立的栈空间,但是共享堆空间
  • 一个进程可以跑多个线程,一个线程可以跑多个协程

goroutine

概述

goroutine就是golang对协程的支持,可以把它理解为golang的协程。

golang的并发只会用到goroutine,所以我们并不用去考虑使用进程、线程。一般线程栈本身大小大约是2MB,而且线程在切换上下文时是消耗资源的,会带来性能消耗,所以我们往往在使用多线程技术时,会通过池化技术,即创建线程池来管理一定数量的线程。

但是在golang中,一个goroutine栈在一开始占用的空间很小,一般只有2KB,并且它的栈大小可以按需求变大或者变小,最大时可以达到1GB(但是一般不用这么大)。所以在golang中一次创建成千上万个或10万个协程理论上也是有可能的。

在golang中,我们使用goroutine完成并发,在某个任务需要并发执行时,只需要把这个任务包装成一个函数,去开启一个goroutine去执行这个函数即可。我们不用维护一个线程池类似的东西,也不需要去关心协程是怎么切换和调度的,因为golang已经内置了调度器帮我们做了,并且效率非常高。

如何使用goroutine

func()
go func()//并发执行

和其他语言相同,golang程序的入口就是main函数。在程序开始执行时,Go程序会为main函数创建一个默认的goroutine,我们称为主协程,我们后来人为的创建的一些goroutine,都是在这个主协程上执行的。

比如:

package mainimport "fmt"func myGoroutine() {fmt.Println("son")
}func main() {go myGoroutine()fmt.Println("father")
}

运行结果:

image-20240912204217798

但是为什么只有主协程在打印,我们创建的协程没有进行打印呢?

这是因为,当main()函数返回时这个goroutine也就是结束了,主协程结束,其他协程不管是不是运行完,都会跟着结束。所以,当主协程打印完“father”返回后,myGoroutine协程还没来的及运行到打印也就是跟着返回了。

所以,我们想看到都打印,只需要让主协程等待几秒就可以了。

package mainimport ("fmt""time"
)func myGoroutine() {fmt.Println("son")
}func main() {go myGoroutine()fmt.Println("father")time.Sleep(2 * time.Second)
}

运行结果:

image-20240912204705774

后面还有更好的方法,不用再让主协程睡眠了。

比如:

package mainimport ("fmt""sync""time"
)func myGoroutine(name string, wg *sync.WaitGroup) {defer wg.Done()for i := 0; i < 2; i++ {fmt.Printf("myGoroutine %s\n", name)time.Sleep(1 * time.Second)}
}func main() {var wg sync.WaitGroupwg.Add(2)go myGoroutine("张三", &wg)go myGoroutine("李四", &wg)time.Sleep(2 * time.Second)wg.Wait()
}

运行结果:

image-20240912205414100

相关文章:

[Golang] goroutine

[Golang] goroutine 文章目录 [Golang] goroutine并发进程和线程协程 goroutine概述如何使用goroutine 并发 进程和线程 谈到并发&#xff0c;大多都离不开进程和线程&#xff0c;什么是进程、什么是线程&#xff1f; 进程可以这样理解&#xff1a;进程就是运行着的程序&…...

【前端】JavaScript高级教程:函数高级——执行上下文与执行上下文栈

文章目录 遍历提升与函数提升执行上下文执行上下文栈(1)执行上下文栈(2)面试题 遍历提升与函数提升 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>01_变量提升与函数提升</title> </head&…...

【阻抗管传递函数法】频域声压,即复声压是指什么

在阻抗管传递函数法中提到的“频域声压数据”&#xff0c;是通过对传声器测得的“时域声压信号”进行快速傅里叶变换&#xff08;FFT&#xff09;后得到的结果。 具体来说&#xff0c;这些频域声压数据指的是传声器测量的声压随时间变化的数据&#xff0c;经过傅里叶变换后&am…...

Python青少年简明教程:类和对象入门

Python青少年简明教程&#xff1a;类和对象入门 Python支持多种编程范式&#xff08;programming paradigms&#xff09;&#xff0c;即支持多种不同的编程风格和方法。初学者开始重点学习关注的编程范式&#xff0c;一般而言是面向过程编程和面向对象编程。面向过程编程&#…...

【vue+el-table】表格操作列宽度跟随按钮个数自适应, 方法封装全局使用

效果图 以上图片分别代表不同用户权限下所能看到的按钮个数, 操作列宽度也会自适应宽度, 就不会一直处于最大宽度, 导致其他权限用户看到的页面出现大量留白问题. 目录 解决方法解决过程中可能出现的问题width赋值时为什么不放update()中btnDom为什么不能直接调用forEach为…...

OpenAI发布全新o1 AI模型具备推理能力

&#x1f989; AI新闻 &#x1f680; OpenAI发布全新o1 AI模型具备推理能力 摘要&#xff1a;OpenAI推出新AI模型o1&#xff0c;具备推理能力&#xff0c;旨在比人类更快地解决复杂问题。o1与o1-mini版本同时发布&#xff0c;前者训练成本较高&#xff0c;但在编程和多步骤问…...

如何在本地部署大语言模型

近年来&#xff0c;随着大语言模型&#xff08;如GPT、BERT等&#xff09;的迅速发展&#xff0c;越来越多的开发者和研究人员希望在本地环境中部署这些强大的模型&#xff0c;以便用于特定的应用场景或进行个性化的研究。本文将详细介绍如何在本地部署大语言模型&#xff0c;涵…...

秒懂:环境变量

前言 1.Linux当中70%以上的命令程序都是用C语言写的 2.执行命令程序和运行自己写的程序没有任何区别 3.自己程序运行必须要带路径&#xff08;绝对/相对都可&#xff09; 4. 系统指令可带可不带&#xff08;带不要瞎带&#xff09; 变量具有全局特性是…...

使用 @Param 注解标注映射关系

目录 1. 场景描述 2. SQL语句 3. 方法定义 4. Param注解的使用 5. 总结 在开发过程中&#xff0c;我们经常需要在Java应用程序中执行数据库操作&#xff0c;尤其是更新操作。在Spring Data JPA框架中&#xff0c;我们可以使用原生SQL语句来执行这些操作&#xff0c;并通过…...

Java学习中在打印对象时忘记调用 .toString() 方法或者没有重写 toString() 方法怎么办?

在 Java 编程中&#xff0c;toString() 方法对于调试、日志记录以及打印对象信息至关重要。然而&#xff0c;许多初学者在打印对象时可能会忘记调用 .toString() 方法&#xff0c;或者在自定义类中没有重写 toString() 方法&#xff0c;这可能导致输出结果不符合预期。 一、Ja…...

如何评估一个RAG(检索增强生成)系统-上篇

最近项目中需要评估业务部门搭建的RAG助手的效果好坏&#xff0c;看了一下目前业界一些评测的方法。目前分为两大类&#xff0c;基于传统的规则、机器学习的评测方法&#xff0c;基于大模型的评测方法。在这里做一些记录&#xff0c;上篇主要做评测方法的记录&#xff0c;下篇会…...

rust解说

Rust 是一种开源的系统编程语言&#xff0c;由 Mozilla 研究院开发&#xff0c;旨在提供高性能、内存安全且并发性良好的编程体验。 Rust 于 2010 年由 Graydon Hoare 开始设计&#xff0c;并在 2015 年发布了第一个稳定版本。 Rust 的设计目标是解决 C 等传统系统编程语言在…...

Elasticsearch 开放 inference API 为 Hugging Face 添加了原生分块支持

作者&#xff1a;来自 Elastic Max Hniebergall 借助 Elasticsearch 开放推理 API&#xff0c;你可以使用 Hugging Face 的推理端点&#xff08;Inference Endpoints&#xff09;在 Elasticsearch 之外执行推理。这样你就可以使用 Hugging Face 的可扩展基础架构&#xff0c;包…...

Jenkins部署若依项目

一、配置环境 机器 jenkins机器 用途&#xff1a;自动化部署前端后端&#xff0c;前后端自动化构建需要配置发送SSH的秘钥和公钥&#xff0c;同时jenkins要有nodejs工具来进行前端打包&#xff0c;maven工具进行后端的打包。 gitlab机器 用途&#xff1a;远程代码仓库拉取和…...

ELK笔记

要搞成这样就需要钱来买服务器 开发人员一般不会给服务器权限&#xff0c;不能到服务器上直接看日志&#xff0c;所以通过ELK看日志。不让开发登录服务器。即使你查出来是开发的问题&#xff0c;费时间&#xff0c;而且影响了业务了&#xff0c;就是运维的问题 开发也不能登录…...

计算机网络 --- 计算机网络的分类

一、计算机网络分类 1.1 按分布范围分类 举例&#xff1a;广域网&#xff08;WAN&#xff09;、局域网&#xff08;LAN&#xff09; 举例&#xff1a;个域网&#xff08;PAN&#xff09; 1.2 按传输技术分类 广播式网络――当一台计算机发送数据分组时&#xff0c;广播范围…...

三维动画|创意无限,让品牌传播更精彩!

随着三维动画技术的不断成熟&#xff0c;三维动画宣传片能够很好地宣传品牌、推广产品&#xff0c;因而慢慢地受到不少企业的青睐&#xff0c;成为品牌最常用的一种宣传方式。 三维动画宣传片作为艺术感极高的宣传视频有强烈的节奏感&#xff0c;而且具有风趣、易懂等特点&…...

欧零导航系统正式版,功能强大,可直接运营

欧零导航系统正式版&#xff0c;带广告位/导航分类/可直接运营 本系统采用PHPMySQL技术开发 拥有独立的安装和后台系统 后台采用BootstripMDUI框架 前台使用响应式界面&#xff0c;自适应各种屏幕 代码免费下载&#xff1a;百度网盘...

了解变压器耦合电压开关 D类放大器

在本文中&#xff0c;我们将讨论另一种 D 类配置&#xff1a;变压器耦合电压切换 (TCVS) 放大器。TCVS 放大器的原理图如图 1 所示。 变压器耦合电压开关 D 类放大器的示意图。 图 1.变压器耦合电压开关 D 类放大器。 在本文中&#xff0c;我们将探索该放大器的工作原理&…...

openssh移植:精致的脚本版

前置文章&#xff1a; busybox移植&#xff1a;全能脚本版-CSDN博客 zlib交叉编译-CSDN博客 openssl移植:精致的脚本版-CSDN博客 源码下载 官网&#xff1a;http://www.openssh.com/ 下载了一个很新的版本 ftp://mirrors.sonic.net/pub/OpenBSD/OpenSSH/portable/openss…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

关于uniapp展示PDF的解决方案

在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

uniapp 实现腾讯云IM群文件上传下载功能

UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中&#xff0c;群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS&#xff0c;在uniapp中实现&#xff1a; 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...

API网关Kong的鉴权与限流:高并发场景下的核心实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中&#xff0c;API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关&#xff0c;Kong凭借其插件化架构…...

ubuntu22.04 安装docker 和docker-compose

首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...

如何把工业通信协议转换成http websocket

1.现状 工业通信协议多数工作在边缘设备上&#xff0c;比如&#xff1a;PLC、IOT盒子等。上层业务系统需要根据不同的工业协议做对应开发&#xff0c;当设备上用的是modbus从站时&#xff0c;采集设备数据需要开发modbus主站&#xff1b;当设备上用的是西门子PN协议时&#xf…...

Qwen系列之Qwen3解读:最强开源模型的细节拆解

文章目录 1.1分钟快览2.模型架构2.1.Dense模型2.2.MoE模型 3.预训练阶段3.1.数据3.2.训练3.3.评估 4.后训练阶段S1: 长链思维冷启动S2: 推理强化学习S3: 思考模式融合S4: 通用强化学习 5.全家桶中的小模型训练评估评估数据集评估细节评估效果弱智评估和民间Arena 分析展望 如果…...