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

GO语言网络编程(并发编程)runtime包

GO语言网络编程(并发编程)runtime包

1. runtime包

1.1.1. runtime.Gosched()

让出CPU时间片,重新等待安排任务(大概意思就是本来计划的好好的周末出去烧烤,但是你妈让你去相亲,两种情况第一就是你相亲速度非常快,见面就黄不耽误你继续烧烤,第二种情况就是你相亲速度特别慢,见面就是你侬我侬的,耽误了烧烤,但是还馋就是耽误了烧烤你还得去烧烤)

package mainimport ("fmt""runtime"
)func main() {go func(s string) {for i := 0; i < 2; i++ {fmt.Println(s)}}("world")// 主协程for i := 0; i < 2; i++ {// 切一下,再次分配任务runtime.Gosched()fmt.Println("hello")}
}

1.1.2. runtime.Goexit()

退出当前协程(一边烧烤一边相亲,突然发现相亲对象太丑影响烧烤,果断让她滚蛋,然后也就没有然后了)

package mainimport ("fmt""runtime"
)func main() {go func() {defer fmt.Println("A.defer")func() {defer fmt.Println("B.defer")// 结束协程runtime.Goexit()defer fmt.Println("C.defer")fmt.Println("B")}()fmt.Println("A")}()for {}
}

1.1.3. runtime.GOMAXPROCS

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

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

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

我们可以通过将任务分配到不同的CPU逻辑核心上实现并行的效果,这里举个例子:

func a() {for i := 1; i < 10; i++ {fmt.Println("A:", i)}
}func b() {for i := 1; i < 10; i++ {fmt.Println("B:", i)}
}func main() {runtime.GOMAXPROCS(1)go a()go b()time.Sleep(time.Second)
}

两个任务只有一个逻辑核心,此时是做完一个任务再做另一个任务。 将逻辑核心数设为2,此时两个任务并行执行,代码如下。

func a() {for i := 1; i < 10; i++ {fmt.Println("A:", i)}
}func b() {for i := 1; i < 10; i++ {fmt.Println("B:", i)}
}func main() {runtime.GOMAXPROCS(2)go a()go b()time.Sleep(time.Second)
}

Go语言中的操作系统线程和goroutine的关系:

1.一个操作系统线程对应用户态多个goroutine。

2.go程序可以同时使用多个操作系统线程。

3.goroutine和OS线程是多对多的关系,即m:n。

http://www.lryc.cn/news/160551.html

相关文章:

  • MR源码解析和join案例
  • ML+LLMs:利用LLMs大语言模型赋能或者结合ML机器学习算法进行具体应用的简介、具体案例之详细攻略
  • python GIL锁
  • git打tag和版本控制规范
  • php版 短信跳转微信小程序
  • leetcode127单词接龙刷题打卡
  • 基于SSM的物流管理系统
  • EagleSDR USB HAT FT600
  • Java多线程(四)锁策略(CAS,死锁)和多线程对集合类的使用
  • 基于spring boot+ vue+ mysql开发的UWB室内外定位系统源码
  • 第2章_瑞萨MCU零基础入门系列教程之面向过程与面向对象
  • 数字图像处理:亮度对比度-几何变换-噪声处理
  • maven报错:[ERROR] 不再支持源选项 7。请使用 8 或更高版本。
  • MySQL基础3-约束
  • OJ练习第166题——课程表(拓扑排序问题)
  • 单臂路由实现VLAN间路由
  • 【VSCode】文件模板创建及使用.md
  • 【漏洞复现】EnjoySCM存在文件上传漏洞
  • MaPLe: Multi-modal Prompt Learning
  • 软件测试/测试开发丨Jenkins Pipeline 学习笔记
  • java多线程——线程池
  • Linux文件操作
  • Tomcat多实例 + Tomcat负载均衡、动静分离(Nginx联动)
  • bootstrap和application的区别
  • 【狂神】SpringMVC笔记(一)之详细版
  • vue 对axios进行封装
  • 第十二章 YOLO的部署实战篇(下篇-cuda)
  • 原生JavaScript+PHP多图上传实现
  • 企业架构LNMP学习笔记30
  • 数学建模算法汇总(全网最全,含matlab案例代码)