golang中的goroutine

1.golang中的主线程:(可以理解为线程/也可以理解为进程),在一个Golang程序的主线程上可以起多个协程。Golang中多协程可以实现并行或者并发。

1.1 goroutine

        协程:可以理解为用户级线程,这是对内核透明的,也就是系统并不知道有协程的存在,是完全由用户自己的程序进行调度的。Golang的一大特色就是从语言层面原生持协程,在函数或者方法前面加go关键字就可创建一个协程。可以说Golang中的协程就是goroutine。

golang中的多协程类似于java中的多线程。

多协程和多线程

多协程和多线程:Golang中每个goroutine(协程)默认占用内存远比Java、C的线程少。

        OS线程(操作系统线程)一般都有固定的栈内存(通常为2MB左右),一个goroutine(协程)占用内存非常小,只有2KB左右,多协程goroutine切换调度开销方面远比线程要少。

1.2 goroutine 的使用

        在主线程(可以理解成进程)中,开启一个goroutine,该协程每隔50毫秒秒输出“你好golang"

        在主线程中也每隔50毫秒输出“你好golang",输出10次后,退出程序,要求主线程和goroutine同时执行。

func test() {for i := 0; i < 5; i++ {fmt.Println("test 你好golang")time.Sleep(time.Millisecond * 100)}
}
func main() {// 通过go关键字,就可以直接开启一个协程go test()// 这是主进程执行的for i := 0; i < 5; i++ {fmt.Println("main 你好golang")time.Sleep(time.Millisecond * 100)}
}

运行结果

main 你好golang
test 你好golang
main 你好golang
test 你好golang
test 你好golang
main 你好golang
main 你好golang
test 你好golang
test 你好golang
main 你好golang

注意:

1.主进程执行完毕后,不管协程有没有执行完成,都会退出

2. 协程可以在主协程没有执行完毕前提前退出,协程是否执行完毕不会影响主协程的执行

3.为了让协程在主线程完毕前推出,这个时候我们可以使用sync.waitgroup等待协程执行完毕

1.3 协程计时器

1.3.1 协程计数器的简单使用

// 定义一个协程计数器
var wg sync.WaitGroupfunc test() {for i := 0; i < 10; i++ {fmt.Println("test1 你好golang", i)time.Sleep(time.Second)}//协程-1wg.Done()
}func test2() {for i := 0; i < 10; i++ {fmt.Println("test2 你好golang", i)time.Sleep(time.Second)}//协程-1wg.Done()
}func main() {//协程+1wg.Add(1)go test()//协程+1wg.Add(1)go test2()//当协程不为0时,主线程停止运行,等到协程数量为0时,主进程继续执行wg.Wait()fmt.Println("主线程退出")
}

运行结果:

test2 你好golang 0
test1 你好golang 0
test1 你好golang 1
test2 你好golang 1
test2 你好golang 2
test1 你好golang 2
test1 你好golang 3
test2 你好golang 3
test2 你好golang 4
test1 你好golang 4
test1 你好golang 5
test2 你好golang 5
test2 你好golang 6
test1 你好golang 6
test1 你好golang 7
test2 你好golang 7
test2 你好golang 8
test1 你好golang 8
test1 你好golang 9
test2 你好golang 9
主线程退出

1.3.2 for循环开启多个协程

func test(num int) {for i := 0; i < 10; i++ {fmt.Printf("协程(%v)打印的第%v条数据 \n", num, i)}// 协程计数器减1vg.Done()
}var vg sync.WaitGroupfunc main() {for i := 0; i < 10; i++ {go test(i)vg.Add(1)}vg.Wait()fmt.Println("主线程退出")
}

1.4 设置Go并行运行的时候占用的cpu数量

Go运行时的调度器使用GOMAXPROCS参数来确定需要使用多少个OS线程来同时执行Go代码。默认值是机器上的CPU核心数。例如在一个8核心的机器上,调度器会把Go代码同时调度到8个oS线程上。

Go 语言中可以通过runtime.GOMAXPROCS()函数设置当前程序并发时占用的CPU逻辑核心数。

Go1.5版本之前,默认使用的是单核心执行。Go1.5版本之后,默认使用全部的CPU逻辑核心数。

func main() {// 获取cpu个数npmCpu := runtime.NumCPU()fmt.Println(npmCpu)// 设置允许使用的CPU数量runtime.GOMAXPROCS(runtime.NumCPU() - 1)
}

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

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

相关文章

CSS 入门:美化网页的魔法

CSS&#xff08;层叠样式表&#xff09;是一种用于描述网页文档样式的标记语言。它可以控制网页的布局、字体、颜色、大小、背景等外观效果。CSS可以与HTML结合使用&#xff0c;通过选择器来选择HTML元素&#xff0c;并为其应用样式。 CSS的基本语法由选择器和声明块组成。选择…

2024_SHCTF_week2_Crypto

pading 题目&#xff1a; from Crypto.Util.number import * import gmpy2 flag bSHCTF{********} assert len(flag) 39 p getPrime(512) q getPrime(512) n p * q e 0x3 pad ba_easy_problem c pow(bytes_to_long(flag pad),e,n) print(fn {n}) print(fc {c})思路…

C语言数据结构学习:[汇总]

介绍 这些是我在学习C语言数据结构时练习的一些题目以及个人笔记 大家也可以参考着来学习 正在更新 大家可以在我的gitee仓库 中下载笔记源文件 笔记源文件可以在Notion中导入 内容导航 C语言数据结构学习&#xff1a;单链表-CSDN博客

Python中的递归函数是如何工作的,它有哪些应用场景?

1、Python中的递归函数是如何工作的&#xff0c;它有哪些应用场景&#xff1f; Python中的递归函数是一种特殊类型的函数&#xff0c;它能够调用自己来解决问题。递归函数的应用非常广泛&#xff0c;可以解决很多不同类型的问题&#xff0c;比如计算阶乘、生成斐波那契数列、字…

webpack5搭建react脚手架详细步骤

1. 初始化项目 首先&#xff0c;创建一个新目录并初始化项目&#xff1a; bash mkdir create-react cd create-react pnpm init --y git init 这里使用pnpm作为包管理工具&#xff0c;因为它在处理依赖和速度上表现更好。 2. 安装React和TypeScript 安装React和React-DOM…

视频编辑的创意工坊,使用视频剪辑软件将视频随机分割成两段并去声进行MP3音频和M3u8文件的生成,让视频制作更高效

面对海量的视频编辑任务&#xff0c;你是否曾感到手足无措&#xff0c;渴望一种既简单又高效的方式来处理它们&#xff1f;别担心&#xff0c;媒体梦工厂软件带着它的魔法棒来啦&#xff01;它就像一位技艺高超的视频巫师&#xff0c;能轻松帮你在线完成视频编辑任务&#xff0…

如何在SpringTask的定时任务中创建动态的定时任务

在Spring框架中&#xff0c;如果你需要在定时任务中动态创建新的定时任务&#xff0c;可以使用TaskScheduler接口。TaskScheduler提供了对任务调度的更细粒度的控制&#xff0c;允许你在运行时动态地创建和管理定时任务。1. 配置 TaskScheduler 首先&#xff0c;需要在Spring配…

提示工程(Prompt Engineering)指南(入门篇)

一、什么是AIGC AIGC全称为 “Artificial Intelligence Generated Content”&#xff0c;即 “人工智能生成内容”。代表了一种由语言模型和聊天机器人等人工智能系统驱动的内容创作的突破性方法。与人类作者制作的传统内容不同&#xff0c;AIGC 是通过算法生成的&#xff0c;…

二十二、Python基础语法(模块)

模块(module)&#xff1a;在python中&#xff0c;每个代码文件就是一个模块&#xff0c;在模块中定义的变量、函数、类别人都可以直接使用&#xff0c;如果想要使用别人写好的模块&#xff0c;就必须先导入别人的模块&#xff0c;模块名须满足标识符规则&#xff08;由字母、数…

解密 Redis:如何通过 IO 多路复用征服高并发挑战!

文章目录 一、什么是 IO 多路复用&#xff1f;二、为什么 Redis 要使用 IO 多路复用&#xff1f;三、Redis 如何实现 IO 多路复用&#xff1f;四、IO 多路复用的核心机制&#xff1a;epoll五、IO 多路复用在 Redis 中的工作流程六、IO 多路复用的优点七、IO 多路复用使用中的注…

stm32 ISP 串口程序下载

硬件原理图&#xff1a; 下载是通过 uart1 。不同的芯片 &#xff0c; 下载的uart 是不一样的。 最终连接到了 PA9&#xff0c; PA10 驱动的安装&#xff1a; 这里的驱动我已经安装过了。 程序下载软件 flymcu 是免安装的。 需要注意的点就是这些。 下载实测&#xff1a;…

电脑连接海康相机并在PictureBox和HWindowControl中分别显示。

展示结果&#xff1a; 下面附上界面中所有控件的Name&#xff0c;只需照着红字设置对应的控件Name即可 下面附上小编主界面的全部代码&#xff1a; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; …

【算法练习】最小生成树

题意&#xff1a;【模板】最小生成树 方法1&#xff1a;Prim算法(稠密边用优&#xff09; #include <bits/stdc.h> using namespace std; int n,m,u,v,d,ans; bool f[5001]; vector<pair<int,int>> a[5001];//用结构体和重载比直接定义小根堆似乎还快一点点…

利用 Google AI 工具提升应用智能化:ML Kit、TensorFlowLite、Cloud Vision、AutoML、Gemini

在code应用开发中&#xff0c;机器学习和人工智能正逐渐成为提升用户体验和应用智能化的重要手段。Google 提供了多种强大的 AI 工具&#xff0c;可以帮助开发者快速集成各种机器学习功能。本文将详细介绍五个关键工具&#xff1a; Firebase ML Kit、TensorFlow Lite、Google …

kafka 的高可用机制是什么?

大家好&#xff0c;我是锋哥。今天分享关于【kafka 的高可用机制是什么&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; kafka 的高可用机制是什么&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Apache Kafka 是一个分布式消息系统&am…

Peach-9B-8k-Roleplay模型部署指南

一、模型介绍 Peach-9B-8k-Roleplay 是一种聊天大型语言模型&#xff0c;它是通过我们的数据合成方法创建的超过 100K 的对话中微调 01-ai/Yi-1.5-9B 模型而获得的。 也许是 34B 以下参数最好的 LLM。 二、部署过程 1、更新环境 apt update2、安装Miniconda wget https://…

标准日志插件项目【C/C++】

博客主页&#xff1a;花果山~程序猿-CSDN博客 文章分栏&#xff1a;项目日记_花果山~程序猿的博客-CSDN博客 关注我一起学习&#xff0c;一起进步&#xff0c;一起探索编程的无限可能吧&#xff01;让我们一起努力&#xff0c;一起成长&#xff01; 目录 一&#xff0c;项目介…

二、Spring的执行流程

文章目录 1. spring的初始化过程1.1 ClassPathXmlApplicationContext的构造方法1.2 refresh方法&#xff08;核心流程&#xff09;1.2.1 prepareRefresh() 方法1.2.2 obtainFreshBeanFactory() 方法1.2.3 prepareBeanFactory() 方法1.2.4 invokeBeanFactoryPostProcessors() 方…

2024年9月电子学会Scratch图形化编程等级考试三级真题试卷

2024年9月Scratch图形化编程等级考试三级真题试卷 一、选择题 第 1 题 单选题 scratch运行下列程序后&#xff0c;变量“和”的取值范围是&#xff1f;&#xff08; &#xff09; A.0~12 B.0~11 C.2~11 D.2~12 第 2 题 单选题 默认角色小猫&#xff0c;scratch运行下列…

深度学习:Matplotlib篇

一、简介 1.1 什么是 Matplotlib&#xff1f; Matplotlib 是一个广泛使用的 2D 绘图库&#xff0c;它可以用来在 Python 中创建各种静态、动态和交互式的图表。无论是科学计算、数据可视化&#xff0c;还是深度学习模型的训练与评估&#xff0c;Matplotlib 都能提供强大的图形…