go语言中的waitGroup

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 函数就为每个可用的物理处理器创建一个逻辑处理
器。需要强调的是,使用多个逻辑处理器并不意味着性能更好。在修改任何语言运行时配置参数
的时候,都需要配合基准测试来评估程序的运行效果

你可能感兴趣的:(go,go)