【Go ~ 0到1 】第八天 goroutine 与 go 关键字 GOMAXPROCS 参数

1. goroutine 概念

goroutine是Go语言中程序中最基本的并发执行单元,每一个Go程序都至少包含一个goroutine ---- main goroutine , 当 Go 程序启动时它会自动创建。

当你需要让某个任务并发执行的时候,你只需要把这个任务包装成一个函数,开启一个 goroutine 去执行这个函数就可以了

2. go 关键字

Go语言中开启goroutine 非常简单,只需要在函数前使用go关键字就行了,从而让该函数或方法在新创建的 goroutine 中执行。

与Java不同的是 , 在Go语言中 , 默认main线程为守护线程

func main() {

	//开启goruntine
	go prinNum()

	time.Sleep(time.Second * 3)

	fmt.Println("程序执行完毕")
}

func prinNum() {
	for i := 0; i < 10; i++ {
		fmt.Println(i)
	}
}

3 . sync.WaitGroup 实现线程同步

在上述代码中,由于main线程执行的太快,有可能其他线程没有执行完毕,程序就已经停止运行了,所以我们使用了Sleep 来休眠 main 线程 其实我们可以使用 sync包下的 WaitGroup 方法

用法类似与 Java中的 闭锁

var wg sync.WaitGroup

func main() {

	wg.Add(1)

	//开启goruntine
	go prinNum()

	wg.Wait()

	fmt.Println("程序执行完毕")
}

func prinNum() {
	for i := 0; i < 10; i++ {
		fmt.Println(i)
	}

	wg.Done()
}

4. GOMAXPROCS 参数

Go运行时的调度器使用GOMAXPROCS参数来确定需要使用多少个 OS 线程来同时执行 Go 代码。默认值是机器上的 CPU 核心数。

例如在一个 8 核心的机器上,GOMAXPROCS 默认为 8。Go语言中可以通过runtime.GOMAXPROCS函数设置当前程序并发时占用的 CPU逻辑核心数。(Go1.5版本之前,默认使用的是单核心执行。Go1.5 版本之后,默认使用全部的CPU 逻辑核心数。)

var wg sync.WaitGroup

func main() {

	// 设置 goroutiner 使用的 os数量
	runtime.GOMAXPROCS(1)

	wg.Add(2)

	go func() {
		for i := 0; i < 10; i++ {
			fmt.Println("A", i)
		}
		wg.Done()
	}()

	go func() {
		for i := 0; i < 10; i++ {
			fmt.Println("B", i)
		}
		wg.Done()
	}()

	wg.Wait()
}
B 0
B 1
B 2
B 3
B 4
B 5
B 6
B 7
B 8
B 9
A 0
A 1
A 2
A 3
A 4
A 5
A 6
A 7
A 8
A 9

如上述代码,尽管我们有两个goroutiner 但只使用了一个 os 所以会等一个线程执行完毕后再去执行另外一个线程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋日的晚霞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值