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

添加2个处理器:运行时.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并行运行还是并发运行,请按顺序打印不同的值。
来自本文: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)上的行,则输出将有所不同。

关于multithreading - Golang : Why are goroutines not running in parallel?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44039223/

10-09 02:13