package main
import (
"fmt"
"runtime"
"sync"
)
const (
Step = Step
LoopCount = 2
)
/*
在go中,每个goroutine会在一个cpu的逻辑core上执行操作,如果CPU是单核的,并且是多个goroutine,可能会存在
一个gouroutine的挂起,go会新建一个thread去goroutine执行队列中拿到下一个任务,然后创建thread就行执行。
等之前被挂起的goroutine的thread的任务再次加载到执行队列中进行执行。之前被挂起的goroutine的thread则会保留
等待下次被重用。goroutine的并发比并行要好很多。
Parallelism is about doing a lot of things at once.
Concurrency is about managing a lot of things at once.
*/
func main() {
var wg sync.WaitGroup
runtime.GOMAXPROCS(2)
//注释掉 tumetime.GOMAXPROCS(2),如果是多核CPU(>=2),每个goroutine会在每个核上执行操作,运行结果显示不会有交叉的地方
wg.Add(2)
go func(wg *sync.WaitGroup) {
defer wg.Done()
for i := 0; i < LoopCount; i++ {
for ch := 'a'; ch < 'a'+Step; ch++ {
fmt.Printf("%c ", ch)
}
fmt.Println("\n")
}
}(&wg)
go func(wg *sync.WaitGroup) {
defer wg.Done()
for i := 0; i < LoopCount; i++ {
for ch := 'A'; ch < 'A'+Step; ch++ {
fmt.Printf("%c ", ch)
}
fmt.Println("\n")
}
}(&wg)
wg.Wait()
}
网友评论