簡體   English   中英

Golang:為什么goroutine不並行運行?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM