我最近在Go中阅读了很多有关并行性和并发性的文章,而我对此一无所知。当我阅读this article about concurrency and parallelism in Go时,遇到了以下语句:
我们可以看到goroutine实际上是并行运行的。都 goroutines立即开始运行,您可以同时看到它们 争夺标准以展示其结果。
此语句与此程序有关:
package main
import (
"fmt"
"runtime"
"sync"
)
func main() {
runtime.GOMAXPROCS(2)
var wg sync.WaitGroup
wg.Add(2)
fmt.Println("Starting Go Routines")
go func() {
defer wg.Done()
for char := ‘a’; char < ‘a’+26; char++ {
fmt.Printf("%c ", char)
}
}()
go func() {
defer wg.Done()
for number := 1; number < 27; number++ {
fmt.Printf("%d ", number)
}
}()
fmt.Println("Waiting To Finish")
wg.Wait()
fmt.Println("\nTerminating Program")
}
哪个输出:
Starting Go Routines
Waiting To Finish
a b 1 2 3 4 c d e f 5 g h 6 i 7 j 8 k 9 10 11 12 l m n o p q 13 r s 14
t 15 u v 16 w 17 x y 18 z 19 20 21 22 23 24 25 26
Terminating Program
因此,这是否意味着在运行时中,从goroutines同时执行两个周期(因此,此时我们可以调用Go并行语言),或者调度程序仅在这两个线程之间切换上下文(可能在fmt.Printf调用中) )并一次只执行一个循环(并发,不是真正的并行性,正如上面引用的作者所述)?
我很困惑。
答案 0 :(得分:1)
在您的情况下,同时打印a-z和1-27的函数都同时启动,并且您要等到两个go例程都结束为止。在拥有多个go例程的同时,您的想法必须是并发的,但是如果您的硬件支持,它们可能会并行运行。
上下文切换也很繁琐,因此大多数时候它们很可能没有完成。 Go例程真的很简单,可以同时运行数百个例程。