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

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.mrgr.cn/news/60036.html

相关文章:

  • 【C++入门】1-(C++)计算机程序设计基础
  • UE ---- 射击游戏
  • 深拷贝和浅拷贝的区别
  • C++ 模板编程:解锁高效编程的神秘密码
  • 获取 Excel 文件中的所有工作表名称,可以通过 OleDbConnection 获取表架构
  • web3对象如何连接以太网络节点
  • OD机试真题-单词接龙
  • (7) cuda异常处理
  • 关于科学计算法 二进制 十进制 16进制 8进制的换算
  • RN的 Button 组件没有 style 属性
  • 微调大模型-4-合并基座模型
  • Supabase:当开源遇上实时数据库服务
  • 进程间通信初识:管道
  • Atlas800昇腾服务器(型号:3000)—SwinTransformer等NPU推理【图像分类】(九)
  • 计算结构体及其中元素的大小
  • Semantic Kernel进阶:创建和管理聊天(ChatCompletion)历史记录对象(四)
  • Linux:认识文件
  • PCL 基于法向量夹角提出错误匹配点对
  • shodan4,挂黑网站查找,弱口令网站搜索
  • 图---java---黑马
  • 【H2O2|全栈】CSS案例章节(一)——圣杯布局和双飞翼布局
  • spring boot 整合Knife4j
  • 【最新】Kali Linux虚拟机安装与优化全攻略:必做设置让你事半功倍!
  • python print常见用法
  • 【鸿蒙开发 | 端云一体化 —— 开发app不要在为没有后端而烦恼了,端云一体化帮你完成一站式开发!】
  • 自动化结账测试:使用 Playwright确保电商支付流程的无缝体验【nodejs]