![](/img/trans.png)
[英]Golang: why using goroutines to parallelize calls ends up being slower?
[英]Golang: Why are goroutines not running in parallel?
我下面有以下示例,其中兩個goroutine應該並行運行。 但是,如果您檢查輸出,則第二個goroutine僅在第一個goroutine完成后運行。 因此,它是順序的。
添加2個處理器: runtime.GOMAXPROCS(2)也無濟於事。 我在具有8核的Mac pro上運行,這絕對不是硬件問題。 所以我的問題-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)
}
為了了解您的程序使用goroutine是並行運行還是並發運行,請按順序打印不同的值。 從本文開始: 並發,Goroutines和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)
並取消注釋on time.Sleep(1 * time.Microsecond)
則輸出將有所不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.