go语言中的waitGroup

本文介绍了Go语言中的WaitGroup,它是一个用于管理goroutine的计数信号量。在示例中,WaitGroup被用来同步两个打印素数的goroutine。同时,讨论了如何通过GOMAXPROCS调整调度器的逻辑处理器数量,以实现并发执行,并提示这可能影响程序性能,建议结合基准测试进行优化。

WaitGroup 是一个计数信号量,可以用来记录并维护运行的 goroutine。如果 WaitGroup
的值大于 0,Wait 方法就会阻塞

 

package main

import (
	"fmt"
	"runtime"
	"sync"
)

var wg sync.WaitGroup

func main() {
	// 分配一个逻辑处理器给调度器使用
	runtime.GOMAXPROCS(1)
	// 计数加 2,表示要等待两个 goroutine
	wg.Add(2)
	// 创建两个 goroutine
	go printPrime("A")
	go printPrime("B")
	fmt.Println("Create Goroutines")
	fmt.Println("Waiting To Finish")
	wg.Wait()
	fmt.Println("Terminating Program")
}

func printPrime(prefix string) {
	defer wg.Done()
next:
	for outer := 2; outer < 50000; outer++ {
		for inner := 2; inner < outer; inner++ {
			if outer%inner == 0 {
				continue next
			}
		}
		fmt.Printf("%s:%d\n", prefix, outer)
	}
	fmt.Println("Completed", prefix)
}

创建了两个 goroutine,分别打印 1~5000 内的素数。查找并显示素数
会消耗不少时间,这会让调度器有机会在第一个 goroutine 找到所有素数之前,切换该 goroutine
的时间片。
在第 12 行中,程序启动的时候,声明了一个 WaitGroup 变量,并在第 20 行将其值设置为
2。之后在第 24 行和第 25 行,在关键字 go 后面指定 printPrime 函数并创建了两个 goroutine
来执行。第一个 goroutine 使用前缀 A,第二个 goroutine 使用前缀 B。和其他函数调用一样,创
建为 goroutine 的函数调用时可以传入参数。不过 goroutine 终止时无法获取函数的返回值。查看
代码清单 6-5 中给出的输出时,会看到调度器在切换第一个 goroutine

 

Go 标准库的 runtime 包里有一个名为 GOMAXPROCS 的函数,
通过它可以指定调度器可用的逻辑处理器的数量。用这个函数,可以给每个可用的物理处理器在
运行的时候分配一个逻辑处理器。代码清单 6-6 展示了这种改动,让 goroutine 并行运行

mport "runtime"
// 给每个可用的核心分配一个逻辑处理器
runtime.GOMAXPROCS(runtime.NumCPU())

包 runtime 提供了修改 Go 语言运行时配置参数的能力。在代码清单 6-6 里,我们使用两
个 runtime 包的函数来修改调度器使用的逻辑处理器的数量。函数 NumCPU 返回可以使用的物
理处理器的数量。因此,调用 GOMAXPROCS 函数就为每个可用的物理处理器创建一个逻辑处理
器。需要强调的是,使用多个逻辑处理器并不意味着性能更好。在修改任何语言运行时配置参数
的时候,都需要配合基准测试来评估程序的运行效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值