golang学习-goroutine

1、goroutine协程

goroutine 是 Go 语言支持并发的核心,一个goroutine会以一个很小的栈开始其生命周期,一般只需要2KB。区别于操作系统线程由系统内核进行调度, goroutine 是由Go运行时(runtime)负责调度。例如Go运行时会智能地将 m个goroutine 合理地分配给n个操作系统线程,实现类似m:n的调度机制,不再需要Go开发者自行在代码层面维护一个线程池。

goroutine 好处:占用内存小,大约2KB,资源调度开销少,用户级线程。

启动goroutine

go关键字

go test()

如果只使用go 开启一个协程,如果主进程执行完毕,协程还没有执行完,这时候协程也会关闭。

为了避免这种情况,使用sync.waitGroup来等待协程完成。下面是代码例子:

Go 复制代码
package main

import (
	"fmt"
	"sync"
	"time"
)

var wg sync.WaitGroup

func test() {
	for i := 0; i < 10; i++ {
		fmt.Println("test golang", i)
		time.Sleep(time.Millisecond * 100)
	}
	wg.Done() //协程计数器-1
}
func main() {
	wg.Add(1) //协程计数器+1
	go test() //开启一个协程
	for i := 0; i < 10; i++ {
		fmt.Println("main golang", i)
		time.Sleep(time.Millisecond * 20)
	}
	wg.Wait() //等待协程执行完毕
	fmt.Println("主线程完成")
}
2、启动多个goroutine

通过下面代码,发现每次打印的数字都不一样这是因为 10 个 goroutine是并发执行的,而 goroutine 的调度是随机的。

Go 复制代码
package main

import (
	"fmt"
	"sync"
)

var wg sync.WaitGroup

func main() {
	for i := 0; i < 10; i++ {
		wg.Add(1)
		go test(i)
	}
	wg.Wait()
}

func test(i int) {
	defer wg.Done()
	fmt.Println("你好test", i)
}

3、设置golang并行运行时占用的cpu数量

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

数。

相关推荐
埋头编程~22 分钟前
【C++】踏上C++学习之旅(十):深入“类和对象“世界,掌握编程黄金法则(五)(最终篇,内含初始化列表、静态成员、友元以及内部类等等)
java·c++·学习
世伟爱吗喽2 小时前
NUXT3学习日记四(路由中间件、导航守卫)
学习
飞凌嵌入式3 小时前
飞凌嵌入式旗下教育品牌ElfBoard与西安科技大学共建「科教融合基地」
嵌入式硬件·学习·嵌入式·飞凌嵌入式
Red Red8 小时前
网安基础知识|IDS入侵检测系统|IPS入侵防御系统|堡垒机|VPN|EDR|CC防御|云安全-VDC/VPC|安全服务
网络·笔记·学习·安全·web安全
Natural_yz10 小时前
大数据学习17之Spark-Core
大数据·学习·spark
qq_1728055910 小时前
RUST学习教程-安装教程
开发语言·学习·rust·安装
一只小小汤圆10 小时前
opencascade源码学习之BRepOffsetAPI包 -BRepOffsetAPI_DraftAngle
c++·学习·opencascade
虾球xz11 小时前
游戏引擎学习第20天
前端·学习·游戏引擎
LateBloomer77711 小时前
FreeRTOS——信号量
笔记·stm32·学习·freertos
legend_jz11 小时前
【Linux】线程控制
linux·服务器·开发语言·c++·笔记·学习·学习方法