下面有以下示例,其中两个goroutine应该并行运行。但是如果检查输出,则第二个goroutine仅在第一个goroutine完成后运行。所以,这是顺序的。
添加2个处理器: runtime.GOMAXPROCS(2)也没有帮助。我正在运行8核的Mac专业版,这绝对不是硬件问题。 所以我的问题 - Golang是否真的平行,如何在下面运行示例 平行?
输出:
Thread 1
Thread 1
…………....
Thread 1
Thread 1
Thread 2
Thread 2
…………....
Thread 2
Thread 2
转到代码:
package main
import (
"runtime"
"time"
)
func main() {
runtime.GOMAXPROCS(2)
go func() {
for i := 0; i < 100; i++ {
println("Thread 1")
//time.Sleep(time.Millisecond * 10)
}
}()
go func() {
for i := 0; i < 100; i++ {
println("Thread 2")
//time.Sleep(time.Millisecond * 10)
}
}()
time.Sleep(time.Second)
}
答案 0 :(得分:2)
为了理解您的程序是并行运行还是并发使用goroutine,依次打印不同的值。 来自这篇文章:Concurrency, Goroutines and GOMAXPROCS。
您的代码无法表达足以表示并行呼叫。请参阅下面的代码。
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()
//time.Sleep(1 * time.Microsecond)
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")
}
从上面的代码中可以看出,使用for循环打印不同的值序列。
如果您对runtime.GOMAXPROCS(2)
发表评论并取消注释time.Sleep(1 * time.Microsecond)
上的行,则输出会有所不同。