0
点赞
收藏
分享

微信扫一扫

第7章 并发

梯梯笔记 2022-02-28 阅读 56
go func() {
	fmt.Println("Hello, World!")
}()
func sum(id int) {
	var x int64
	for i := 0; i < math.MaxUint32; i++ {
		x += int64(i)
	}
	fmt.Println(id, x)
}

func main() {
	wg := new(sync.WaitGroup)
	wg.Add(2)
	for i := 0; i < 2; i++ {
		go func(id int) {
			defer wg.Done()
			sum(id)
		}(i)
	}
	wg.Wait()
}
/*
	1 9223372030412324865
	0 9223372030412324865
*/

/*
linux下执行该命令:
$ go build -o test
$ time -p ./test
0 9223372030412324865
1 9223372030412324865
real 7.70 // 程序开始到结束时间差 (⾮ CPU 时间)
user 7.66 // ⽤户态所使⽤ CPU 时间⽚ (多核累加)
sys 0.01 // 内核态所使⽤ CPU 时间⽚
$ GOMAXPROCS=2 time -p ./test
0 9223372030412324865
1 9223372030412324865
real 4.18
user 7.61 // 虽然总时间差不多,但由 2 个核并⾏,real 时间⾃然少了许多。
sys 0.02
*/
func main() {
	wg := new(sync.WaitGroup)
	wg.Add(1)
	go func() {
		defer wg.Done()
		defer fmt.Println("A.defer")
		func() {
			defer fmt.Println("B.defer")
			runtime.Goexit() // 终⽌当前 goroutine
			fmt.Println("B") // 不会执⾏
		}()
		fmt.Println("A") // 不会执⾏
	}()
	wg.Wait()
	/*
		B.defer
		A.defer
	*/
}
func main() {
	wg := new(sync.WaitGroup)
	wg.Add(2)
	go func() {
		defer wg.Done()
		for i := 0; i < 6; i++ {
			fmt.Println(i)
			if i == 3 {
				runtime.Gosched() //当i=3时,暂停当前协程
			}
		}
	}()
	go func() {
		defer wg.Done()
		fmt.Println("Hello, World!")
	}()
	wg.Wait()
	/*
		0
		1
		2
		3
		Hello, World!
		4
		5
	*/
}
举报

相关推荐

第14章 并发

第11章 并发控制

第7章 事务

第7章、函数

第7章链接:引言

第7章单行函数

架构第7章 CAP

0 条评论