Golang:为什么 goroutine 不并行运行?

PAR*_*RUS 4 parallel-processing multithreading go

我有下面的示例,其中两个 goroutine 应该并行运行。但是如果你检查输出,第二个 goroutine 仅在第一个 goroutine 完成后运行。所以,它是顺序的。

\n\n

添加 2 个处理器:runtime.GOMAXPROCS(2)也没有帮助。我在 8 核 Mac pro 上运行,这绝对不是硬件问题。\n所以我的问题 - Golang 真的是并行的吗?如何使下面的示例并行运行?

\n\n

输出:

\n\n
Thread 1\nThread 1\n  \xe2\x80\xa6\xe2\x80\xa6\xe2\x80\xa6\xe2\x80\xa6....\nThread 1\nThread 1\nThread 2\nThread 2\n  \xe2\x80\xa6\xe2\x80\xa6\xe2\x80\xa6\xe2\x80\xa6....\nThread 2\nThread 2\n
Run Code Online (Sandbox Code Playgroud)\n\n

去代码:

\n\n
package main\n\nimport (\n    "runtime"\n    "time"\n)\n\nfunc main() {\n\n    runtime.GOMAXPROCS(2)\n\n    go func() {\n        for i := 0; i < 100; i++ {\n            println("Thread 1")\n            //time.Sleep(time.Millisecond * 10)\n        }\n    }()\n\n    go func() {\n        for i := 0; i < 100; i++ {\n            println("Thread 2")\n            //time.Sleep(time.Millisecond * 10)\n        }\n    }()\n\n    time.Sleep(time.Second)\n}\n
Run Code Online (Sandbox Code Playgroud)\n

Guj*_*ana 6

为了了解您的程序是并行运行还是同时使用 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")
}
Run Code Online (Sandbox Code Playgroud)

从上面的代码可以看出,使用 for 循环打印不同的值序列。

如果您注释runtime.GOMAXPROCS(2)并取消注释该行,则输出会有所不同time.Sleep(1 * time.Microsecond)